我在Windows上,我正在使用subprocess.Popen
启动一个我希望在某个时刻终止的新进程。但是,我发起的gui仍然可见。一个最小的例子是启动PNG查看器:
import subprocess
proc = subprocess.Popen(['start', 'test.png'], shell=True)
proc.kill()
在kill()
命令后,gui仍在运行,我必须手动关闭它。
正如我所理解的那样,可以通过将preexec_fn=os.setsid
传递给Popen
来解决这个问题(参见How to terminate a python subprocess launched with shell=True)。由于命令os.setsid
特定于Linux,我不知道如何在Windows上实现它。
另一种方法是摆脱shell=True
,但是,我不知道如何实现这一点,因为我必须传递文件名。
非常感谢任何帮助......
答案 0 :(得分:2)
如果你想摆脱shell=True
,你必须提供可执行文件的完整路径。
import subprocess
proc = subprocess.Popen('/full/path/start %s' % filename)
proc.kill()
答案 1 :(得分:1)
start
是一个内部命令:它需要cmd.exe
(您可以开始使用shell=True
或直接运行)。 Popen()
不等待start
命令完成且start
不等待PNG查看器退出 - 当您致电proc.kill()
时,start
可能已经完成了。
您可以尝试直接运行PNG查看器(如果可以在标准位置找到相应的exe文件,则无需提供完整路径。)
How to terminate a python subprocess launched with shell=True也有适用于Windows的解决方案(如果PNG查看器启动子进程,您可以尝试使用它。)