在 Python 中终止启动的 Popen 子进程

Terminating started Popen subprocess in Python

我在 Windows,我正在使用 subprocess.Popen 开始一个新进程,我想在某个时间点终止。但是,我启动的 gui 仍然可见。一个最小的例子是启动 PNG 查看器:

import subprocess
proc = subprocess.Popen(['start', 'test.png'], shell=True)
proc.kill()

kill() 命令之后,gui 仍然是 运行,我必须手动关闭它。

据我所知,这可以在 Linux 上通过将 preexec_fn=os.setsid 传递给 Popen 来解决(参见 How to terminate a python subprocess launched with shell=True)。由于命令 os.setsid 特定于 Linux 我不知道如何在 Windows 上实现它。

另一种方法是摆脱 shell=True,但是,我不知道如何实现这一点,因为我必须传递文件名。

任何帮助将不胜感激...

如果你想删除 shell=True 你必须给出可执行文件的完整路径。

import subprocess
proc = subprocess.Popen('/full/path/start %s' % filename)
proc.kill()

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