2015-12-18 25 views
1

我必須寫一個Python代碼爲我的生產服務器,因此嘗試通過一個例子來清除我的概念。 Python腳本必須調用並執行bash shell腳本 - shell腳本可能會轉儲大量消息並退出成功或退出(2)系統調用。因此,我通過以下方法嘗試:獲取獨立的變量stderr和標準輸出與退出狀態

import subprocess 
try: 
     output = subprocess.check_output(
       'bash mytest', 
      shell=True, 
      stderr=subprocess.STDOUT, 
     ) 
     print 'Have %d bytes in output' % len(output) 
     print output 
except subprocess.CalledProcessError, e: 
     print "Error String:", e.output 
     print "Error Return code:", e.returncode 

的代碼工作正常,但它是調用鑑於該腳本可以(使用echo)打印數百行的正確途徑。

將輸出變量兼得stderr和標準輸出消息通過bash腳本印?我可以在單獨的變量中獲得bash腳本的stderr和stdout消息 - 請記住,如果腳本成功運行,可能根本沒有任何stderr消息?

此外,我應該承擔的情況下,異常subprocess.CalledProcessError沒有拋出的返回碼0(成功)?

是否有實現相同的一個更好的辦法 - 將這種方法確保Python腳本會等到bash腳本的完成?

在此先感謝。

+0

請閱讀[本教程(https://pymotw.com/2/subprocess/)上PMOTW – Pynchia

+0

和[此SO Q&A]( http://stackoverflow.com/questions/5631624/how-to-get-exit-code-when-using-python-subprocess-communicate-method) – Pynchia

回答

0

如果你想同時捕獲stdoutstderr你必須使用一個低級別的功能。擴大對check_output的源代碼,這裏是你可以做什麼:

process = Popen(stdout=PIPE, stderr=PIPE, *popenargs, **kwargs) 
output, stderr = process.communicate() 
retcode = process.poll() 
if retcode: 
    cmd = kwargs.get("args") 
    if cmd is None: 
     cmd = popenargs[0] 
    raise CalledProcessError(retcode, cmd, output=stderr) # or your own exception 
return output 
相關問題