2015-09-04 65 views
4

我有一些代碼,它是一個標準命令stdout。stdout/stderr元組或字符串輸出

params = [toolsDir + "\\adb.exe", "shell", "pm", "path", app] 
p = Popen(params, shell=False, stdout=subprocess.PIPE) 
stdout, stderr = p.communicate() 
    if "package:" in stdout: 
     package = stdout[8:].rstrip() 

第3行,返回字符串,如第5行然後成功地工作而不會出現錯誤,我可以拆分和rstrip()可以在「包」。

stdout, stderr = p.communicate() 

但是...如果我從第3行中刪除 '標準錯誤',所以它最終成爲

stdout = p.communicate() 

我得到的錯誤:

package = stdout[8:].rstrip() 
AttributeError: 'tuple' object has no attribute 'rstrip' 

有人能解釋爲什麼這因爲stderr甚至沒有被定義爲第二行Popen上的管道,所以爲什麼它會返回一個沒有stderr的元組,而是一個字符串呢?

我已經解決了這個問題,雖然花了我30分鐘,現在想知道爲什麼它很重要。 謝謝。

回答

3

communicate返回一個元組

所以,你可以解開它(在你的第一個版本等)上即時:

stdout, stderr = p.communicate() 

,或者你可以得到的元組按原樣(像是修改後的代碼):您要刪除stderr

stdout = p.communicate() # tuple with 'stdout' and 'stderr' 

我,你可以寫:

stdout = p.communicate()[0] 
+0

完美無缺,非常感謝。 – number12

1

這個簡單的例子可以幫助你明白是怎麼回事:

>>> a, b = (1,2) 
>>> a 
1 
>>> b 
2 

如果b被刪除,則:

>>> a = (1,2) 
>>> a 
(1, 2) 

a分配整個元組的值,這是不你想要什麼。