Python - 摆脱不必要的输出

时间:2017-04-04 18:05:15

标签: python bash

我使用SSH登录远程节点,获取服务的状态并想要打印它。

在我的远程节点上运行bash命令会产生。

[root@redis-1 ~]# 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 个答案:

答案 0 :(得分:1)

当您使用.readlines()时,它将返回一个行列表。如果您想在一个字符串中使用.read(),则可以使用.decode('utf-8')。它有b,因为它是一个字节串。要将其设置为普通字符串,您可以在大多数情况下使用.strip()。它可能是一个不同的编码,但utf-8可能会工作。然后,要删除新行,您可以使用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

当你只有一行时,任何一个都可以工作。如果你有多行,第一行将无法正常工作;它会在字符串的中间有multipart.toString().getBytes()

答案 1 :(得分:1)

调用subprocess.Popen然后从其stdout属性手动读取的整个过程可以压缩为一个调用,该调用也会自动执行字节到字符串的转换:

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

如果您还想阅读stderr,请添加stderr=subprocess.STDOUT

您可以在此处找到subprocess.check_output的{​​{3}}。