Python 子进程 kill 适用于"notepad.exe"但不适用于"calc.exe"



OS: Windows 10 蟒蛇:3.5.2 我正在尝试打开 calc.exe执行一些操作,然后关闭它。 这是我的代码示例

import subprocess, os, time
p = subprocess.Popen('calc.exe')
#Some actions
time.sleep(2)
p.kill()

所以这对 calc.exe不起作用,它只是打开计算器,但没有关闭它,但相同的代码适用于"记事本.exe"。

我猜进程终止方法的子进程库中存在错误。 所以任务管理器中的记事本.exe进程名称是记事本.exe,但 calc.exe进程名称是计算器.exe,所以我猜它试图按名称杀死并且找不到它。

subprocess.kill中没有错误。如果您真的担心这一点,只需检查从文档中链接的来源。kill方法只调用send_signal,除非该过程已经完成,否则它只会调用os.kill,您可以看到该函数的 Windows 实现。简而言之:subprocess.Process.kill不在乎进程在内核的进程表(或任务管理器(中的名称;它记住它启动的进程的PID(进程ID(,并以这种方式杀死它。

最可能的问题是,像许多Windows应用程序一样,calc.exe有一些特殊的"单实例"代码:当您启动它时,如果会话中已经有calc.exe的副本正在运行,它只是告诉该副本来到前台(如果没有,则打开一个窗口(,然后退出。因此,当您在 2 秒后尝试kill它时,该过程已经退出。

如果实际运行过程是calculator.exe,这意味着calc.exe只是真实程序的启动器,所以它总是告诉calculator.exe来到前台,必要时启动它,然后退出。

那么,你怎么能杀死你启动的新计算器呢?好吧,你不能,因为你没有开始一个新的。您可以杀死所有calc.exe和/或calculator.exe进程(最简单的方法是使用像psutil这样的第三方库 - 请参阅有关过滤的示例,然后在找到进程后kill该进程(,但这将杀死您在运行程序之前打开的任何现有计算器进程,而不仅仅是您启动的新进程。由于calc.exe无法判断您是否已经开始了新流程,因此确实没有办法解决这个问题。

这是杀死它的一种方法,但它会关闭每个打开的计算器。

它调用无窗口命令提示符,并提供关闭计算器.exe进程的命令。

import subprocess, os, time
p = subprocess.Popen('calc.exe')
print(p)
#Some actions
time.sleep(2)
CREATE_NO_WINDOW = 0x08000000
subprocess.call('taskkill /F /IM Calculator.exe', creationflags=CREATE_NO_WINDOW)

最新更新