[英]Blocking and Non Blocking subprocess calls
我在subprocess.call()
, subprocess.Popen()
, subprocess.check_call()
之間完全混淆。
哪個是封鎖哪個不是?
我的意思是說,如果我使用subprocess.Popen()
,父進程是否等待子進程在繼續執行之前return
/ exit
。
shell=True
如何影響這些調用?
Popen
是非阻塞的。 call
和check_call
是阻塞的。 您可以通過調用其wait
或communicate
方法來創建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腳本結束后還是一樣。准備殺ls
與pkill ls
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.