[英]Python subprocess kill is working for “notepad.exe” but not working for “calc.exe”
操作系统:Windows 10 Python:3.5.2我试图打开calc.exe做一些动作,然后关闭它。 这是我的代码示例
import subprocess, os, time
p = subprocess.Popen('calc.exe')
#Some actions
time.sleep(2)
p.kill()
因此,这对于calc.exe不起作用,它只是打开计算器,但没有关闭它,但是对于“ notepad.exe”来说,相同的代码工作正常。
我猜在子进程库中有一个用于进程终止方法的错误。 因此,任务管理器中的notepad.exe进程名称为notepad.exe,但是calc.exe进程名称为Calculator.exe,因此,我猜测它正在尝试按名称杀死它并找不到它。
subprocess.kill
没有错误。 如果您真的对此感到担心,请检查docs链接的源代码 。 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
使得无法判断您是否已开始新进程,因此实际上没有解决办法。
这是杀死它的一种方法,但是它将关闭所有打开的计算器。
它会调用no window命令提示符,并给出命令以关闭Calculator.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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.