2010-11-12 74 views
2

我有一個簡單的腳本,用於在測試中將我們的軟件(Moab Workload Manager)的CLI調用自動化,以避免必須使用'--xml'標誌來獲取xml輸出然後管理整齊,以便易讀。它使用subprocess.Popen調用來運行該命令,然後使用str.strip()str.replace()對返回的xml進行小的清理,以便於直觀地檢查。有問題的代碼是在這裏:Python 3 subprocess.PIPE輸出錯誤


cmdString = "%s --xml" % cmd 
cmdList = cmdString.split() 

cmdRun = subprocess.Popen(cmdList, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.PIPE) 

crOut,crErr = cmdRun.communicate() 

xmlOutput = crOut.strip().replace("><",">\n<").replace("\" ","\"\n") 


當我運行這個(我最近升級我的Python到Python 3.1.2),我現在得到以下錯誤:


Traceback (most recent call last): 
    File "/usr/local/bin/xmlcmd", line 50, in <module> 
    runXMLCmd(getCmd()) 
    File "/usr/local/bin/xmlcmd", line 45, in runXMLCmd 
    xmlOutput = crOut.strip().replace("><",">\n<") 
TypeError: expected an object with the buffer interface 


它似乎是溝通()調用返回字節數組,但在python解釋器,如果我做 dir(bytes)我可以仍然看到strip()和replace()函數。任何人都知道如何做到這一點?

謝謝。

回答

3

bytes.replace()預計字節作爲參數:

crOut.strip().replace(b"><", b">\n<").replace(b"\" ", b"\"\n") 

儘管一般它可能是優選將輸入到Unicode文本儘早進行解碼。並對文本進行轉換(不是字節)。

1

您需要使用crOut.decode("utf-8")並在返回的字符串中執行.replace。

1

在Python 3.2中,使用decode('ascii')修復了一些很難追蹤的unicode和type錯誤。無論字節或bytearray解碼將根據需要轉換爲字符串。

pipe = subprocess.Popen("cmd", 1024, stdout=subprocess.PIPE) 
while pipe.returncode == None: 
    lines = pipe.communicate()[0] 
    lines = lines.decode('ascii') 
    for line in lines.splitlines(): 
     if (re.search('^---', line)): 
      pass # do stuff 

從手冊,

bytes.decode(encoding="utf-8", errors="strict") 
bytearray.decode(encoding="utf-8", errors="strict") 
Return a string decoded from the given bytes. 
Default encoding is 'utf-8'. errors may be given to set a 
different error handling scheme.