繁体   English   中英

Python子进程kill适用于“ notepad.exe”,但不适用于“ calc.exe”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM