[英]Trouble with subprocess.check_output()
我使用subprocess.check_output()
遇到了一些奇怪的問題。 起初我只是使用subprocess.call()
,一切正常。 但是,當我只是為check_output()
切換call()
check_output()
,我收到一個奇怪的錯誤。
代碼之前(工作正常):
def execute(hosts):
''' Using psexec, execute the batch script on the list of hosts '''
successes = []
wd = r'c:\\'
file = r'c:\\script.exe'
for host in hosts:
res = subprocess.call(shlex.split(r'psexec \\\\%s -e -s -d -w %s %s' % (host,wd,file)))
if res.... # Want to check the output here
successes.append(host)
return successes
代碼后(不起作用):
def execute(hosts):
''' Using psexec, execute the batch script on the list of hosts '''
successes = []
wd = r'c:\\'
file = r'c:\\script.exe'
for host in hosts:
res = subprocess.check_output(shlex.split(r'psexec \\\\%s -e -s -d -w %s %s' % (host,wd,file)))
if res.... # Want to check the output here
successes.append(host)
return successes
這給出了錯誤:
我無法重定向這個,因為程序掛起來,我不能ctrl-c出來。 任何想法為什么會這樣? subprocess.call()和check_output()之間可能導致這種情況有什么區別?
以下是包含多處理部分的附加代碼:
PROCESSES = 2
host_sublists_execute = [.... list of hosts ... ]
poolE = multiprocessing.Pool(processes=PROCESSES)
success_executions = poolE.map(execute,host_sublists_execute)
success_executions = [entry for sub in success_executions for entry in sub]
poolE.close()
poolE.join()
謝謝!
您遇到了Python Issue 9400 。
關於subprocess.call()
和subprocess.check_output()
你必須要了解一個關鍵的區別。 subprocess.call()
將執行您提供的命令,然后為您提供返回代碼 。 另一方面, subprocess.check_output()
以字符串形式返回程序的輸出,但它會嘗試幫助你並檢查程序的返回代碼並在程序未執行時引發異常 ( subprocess.CalledProcessError
)成功(返回非零返回碼)。
當您使用多處理池調用pool.map()
時,它將嘗試將子pool.map()
異常傳播回main並在那里引發異常。 顯然,如何定義subprocess.CalledProcessError
異常類存在問題,因此當多處理庫嘗試將異常傳播回main時,pickling會失敗。
你調用返回一個非零返回碼的程序,這使得subprocess.check_output()
拋出一個異常,並且pool.map()
不能正確處理它,所以你得到的TypeError
從失敗的嘗試結果檢索異常。
作為旁注, subprocess.CalledProcessError
的定義必須搞砸,因為如果我打開我的2.7.6終端,導入子進程,並且手動引發錯誤,我仍然得到TypeError
,所以我不認為它只是酸洗問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.