簡體   English   中英

阻止和非阻止子進程調用

[英]Blocking and Non Blocking subprocess calls

我在subprocess.call()subprocess.Popen()subprocess.check_call()之間完全混淆。

哪個是封鎖哪個不是?

我的意思是說,如果我使用subprocess.Popen() ,父進程是否等待子進程在繼續執行之前return / exit

shell=True如何影響這些調用?

Popen是非阻塞的。 callcheck_call是阻塞的。 您可以通過調用其waitcommunicate方法來創建Popen實例塊。

如果你在看源代碼 ,你會看到call呼叫Popen(...).wait()這就是為什么它被阻塞。 check_call調用call ,這也是它阻塞的原因。

嚴格來說, shell=True與阻塞問題正交。 但是, shell=True會導致Python執行shell,然后在shell中運行該命令。 如果您使用阻止呼叫,則在shell完成時將返回呼叫。 由於shell可能會生成一個子進程來運行命令,因此shell可能會在生成的子進程之前完成。 例如,

import subprocess
import time

proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()

這里產生了兩個進程:Popen生成一個運行shell的子進程。 shell反過來生成一個運行ls的子ls proc.terminate()殺死shell,但運行ls的子proc.terminate()仍然存在。 (這是由豐富的輸出表現,在python腳本結束后還是一樣。准備殺lspkill ls )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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