在Python

时间:2015-05-06 07:52:07

标签: python subprocess popen

我在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,但是,我不知道如何实现这一点,因为我必须传递文件名。

非常感谢任何帮助......

2 个答案:

答案 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查看器启动子进程,您可以尝试使用它。)