2014-07-01 61 views
1

Python中的子進程調用是否掛起?也就是說,子進程調用是否與其他Python代碼在同一線程中運行,還是它是非阻塞模型?在這個問題上,我找不到任何文件或SO。謝謝!Python子進程調用掛起?

+0

你指的是哪個子過程函數? – tdelaney

+0

例如'subprocess.call([「./ myOtherScript」])' – goodcow

回答

3

subprocess模塊中的大多數方法都是阻塞的,這意味着它們希望子流程在返回之前完成。但是,subprocess.Popen是非阻塞的。

result = subprocess.call(cmd) # This will block until cmd is complete 
p = subprocess.Popen(cmd) # This will return a Popen object right away 

一旦有Popen對象,你可以使用poll實例方法,看看子進程是完全沒有阻擋。

if p.poll() is None: # Make sure you check against None, since it could return 0 when the process is complete. 
    print "Process is still running" 
+0

如果我在'cmd'的末尾添加'&',那麼怎麼辦? – goodcow

+0

@goodcow如果你同時使用'shell = True',它不會阻塞。不過,我建議直接使用'Popen'。 – dano

2

子流程在後臺運行。在subprocess模塊​​中,有一個名爲Popen的類在後臺啓動一個進程。它有一個wait()方法可以用來等待進程完成。它還有一個通信()輔助方法,它將處理stdin/stdout/stderr加上等待進程完成。它還具有諸如call()和check_call()之類的便利功能,可以創建Popen對象,然後等待它完成。

因此,子進程實現了一個非阻塞模型,但也給你阻塞幫助函數。