subprocess.Popen不能使用shell = False

时间:2017-02-22 12:19:46

标签: python shell subprocess

我尝试在同一shell中的Windows中运行简单脚本。 我跑的时候

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

工作正常。

但是当我跑步时

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

它打开了新的shell,而shell = false没有任何影响。

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

1 个答案:

答案 0 :(得分:0)

首先使用Popen调用shell=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()