2017-04-04 58 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