簡體   English   中英

如何等待Python subprocess.check_output()完成?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM