2017-02-22 25 views
0

我嘗試在同一個shell中的Windows中運行簡單的腳本。 當我運行時subprocess.Popen無法與shell = False

subprocess.call(["python.exe", "a.py"], shell=False) 

它工作正常。

但是當我運行

subprocess.Popen(["python.exe", "a.py"], shell=False) 

它打開新的外殼,外殼=假沒有影響。

a.py只是將消息打印到屏幕上。

+0

的可能的複製[Python的:子調用與SHELL =假不工作(http://stackoverflow.com/questions/25465700/python-subprocess-call- with-shell-false-not-working) –

回答

0

首先調用Popenshell=False並不意味着底層python不會嘗試打開窗口/控制檯。只是當前的python實例直接執行python.exe而不是在系統shell(cmd或sh)中執行。

其次,Popen返回該進程的句柄,並且您必須在該句柄上執行wait()才能正確結束,否則可能會生成一個不可用的進程(取決於您正在運行的平臺)。我建議你試試

p = subprocess.Popen(["python.exe", "a.py"], shell=False) 
return_code = p.wait() 

等待進程終止並得到返回碼。

請注意,Popen是在後臺運行進程的一種非常糟糕的方式。最好的方法是使用一個單獨的線程

import subprocess 
import threading 

def run_it(): 
    subprocess.call(["python.exe", "a.py"], shell=False) 

t = threading.Thread(target=run_it) 
t.start() 
# do your stuff 

# in the end 
t.join() 
+0

但我不想等到這個過程結束。這就是我使用Popen而不是調用的原因。 – Hila

+0

好的,然後看我的編輯。根本不要使用「Popen」。 –

+0

謝謝,問題是,它仍然等待線程完成...我希望我的代碼將運行,執行另一個進程並退出。我不想等待這個過程完成。 – Hila