[英]How to wait for Python subprocess.check_output() to complete?
我正在循環運行此代碼-在Python 3.6中:
# previous code: copy certain files to the working folder
shellCmd = "myCmd " + file1 + " " + file2
# myCmd works on file1 and file2
result = subprocess.check_output(myCmd, shell=True)
# delete the files
有時我會因拒絕訪問某些文件而導致失敗。 我猜該子進程正在后台運行,並且循環繼續進行,從而產生了其他子進程。 有時,這將導致一個子進程嘗試復制(或刪除)myCmd在另一子進程中仍在忙的文件。
如何停止並等待subprocess.check_output()完成?
我看到subprocess.Popen有一個wait()函數,但是我需要myCmd進程的結果字符串,因此想使用subprocess.check_output()。
但是,任何能夠(a)使我獲得myCmd的字符串輸出,以及(b)確保子進程按順序進行的解決方案都是可以的。
謝謝!
不, check_output
僅在子進程完成運行后返回。 您的問題是由其他原因引起的。
您描述的情況遠不能令人滿意,因為如果我正確理解您的描述,似乎多個子流程有時會創建競爭條件。 邏輯上的事情是讓您的程序從子進程的顯示中讀取輸出。
如果要更好地控制子subprocess.Popen
,則可以使用subprocess.Popen
對象,該對象具有更可用的接口,因此更加安全。 通過讀取一個命令的輸出直到到達文件結尾,您知道您將不會創建其他進程來進行干預。 將命令的標准輸出發送到帶有stdout=subprocess.PIPE
的管道,然后您可以讀取流程的標准輸出作為Popen
對象的stdout
屬性,如下所示。
>>> process = subprocess.Popen("getmac", stdout=subprocess.PIPE)
>>> for line in process.stdout:
... print(line)
...
b'\r\n'
b'Physical Address Transport Name \r\n'
b'=================== ==========================================================\r\n'
b'94-C6-91-1B-56-A4 \\Device\\Tcpip_{023B9717-B878-43D4-A0BE-28A4295785FA} \r\n'
b'68-EC-C5-52-14-AD Media disconnected \r\n'
b'68-EC-C5-52-14-B1 Media disconnected \r\n'
b'0A-00-27-00-00-0E \\Device\\Tcpip_{89DD54F9-0C99-4F5B-8376-45598FB4C0FD} \r\n'
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.