2017-04-04 30 views
0

我使用SSH登录到远程节点,获取服务的状态并希望打印它。Python - 摆脱不必要的输出

在我的远程节点上运行bash命令yield。

[[email protected] ~]# redis-cli -a '!t3bmjEJss' info replication | grep role | cut -d':' -f2 
slave 

是香港专业教育学院编写的Python代码是

def serviceDetails(ip,svc): 
    if svc == 'redis-server': 
     ssh = subprocess.Popen(["ssh", "%s" % ip, "redis-cli -a '!t3Z9LJt2_wmUDbmjEJss' info replication | grep role | cut -d':' -f2"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
     result = ssh.stdout.readlines() 
     print (result) 
    else: 
     print ("Redis service is not running on this node") 

,我从result变量中获得的输出为:

[b'slave\r\n'] 

为什么所有这些多余的字符出现?我该如何摆脱它们?

+2

'result = result.encode('utf-8')。strip()' – zondo

+0

@zondo这是一个列表吗?由于现在即时得到 回溯(最近通话最后一个): 文件“”,1号线,在 AttributeError的:“名单”对象有没有属性“编码” 。结果是一个列表。 –

+1

对不起,不。这是'stdout'中的每一行。你会希望'result = [line.encode('utf-8')。strip()for line]' – zondo

回答

2

调用subprocess.Popen后的整个过程,从它的stdout财产手动阅读可以浓缩成一个调用,它也会自动执行字节字符串转换:

subprocess.check_output([arg0, arg1, ...], encoding='utf-8') 

如果你也想读的标准错误,然后包括stderr=subprocess.STDOUT

您可以在这里找到docssubprocess.check_output

2

当您使用.readlines()时,它将返回一个行列表。如果您希望全部使用一个字符串,则可以使用.read()。它有b,因为它是一个字节字符串。要将其转换为普通字符串,大多数情况下可以使用.decode('utf-8')。它可能是一种不同的编码,但utf-8可能会工作。然后为了摆脱新的路线,您可以使用.strip()。全部放在一起,无论是这些将工作:

result = ssh.stdout.read().decode('utf-8').strip() 
print(result) 
# slave 

result = [line.decode('utf-8').strip() for line in ssh.stdout.readlines()] 
print(result) 
# ['slave'] 

任一个,当你只有一个行会的工作。如果您有多条线路,则第一条线路将无法正常工作;它将在字符串中间有\r\n