OS: Windows 10 Python: 3.5.2 I am trying to open calc.exe do some actions and than close it. Here is my code sample
import subprocess, os, time
p = subprocess.Popen('calc.exe')
#Some actions
time.sleep(2)
p.kill()
So this is not working for calc.exe, it just opens the calculator, but does not close it, But same code is working fine for "notepad.exe".
I am guessing that there is a bug in subprocess lib for process kill method. so the notepad.exe process name in task manager is notepad.exe, but the calc.exe process name is calculator.exe, so I am guessing it is trying to kill by name and do not find it.
There's no bug in subprocess.kill
. If you're really worried about that, just check the source , which is linked from the docs . The kill
method just calls send_signal
, which just calls os.kill
unless the process is already done, and you can see the Windows implementation for that function . In short: subprocess.Process.kill
doesn't care what name the process has in the kernel's process table (or the Task Manager); it remembers the PID (process ID) of the process it started, and kills it that way.
The most likely problem is that, like many Windows apps, calc.exe
has some special "single instance" code: when you launch it, if there's already a copy of calc.exe
running in your session, it just tells that copy to come to the foreground (and open a window, if it doesn't have one), and then exits. So, by the time you try to kill
it 2 seconds later, the process has already exited.
And if the actual running process is calculator.exe
, that means calc.exe
is just a launcher for the real program, so it always tells calculator.exe
to come to the foreground, launching it if necessary, and then exits.
So, how can you kill the new calculator you started? Well, you can't, because you didn't start a new one. You can kill all calc.exe
and/or calculator.exe
processes (the easiest way to do this is with a third-party library like psutil
—see the examples on filtering and then kill
the process once you've found it), but that will kill any existing calculator process you had open before running your program, not just the new one you started. Since calc.exe
makes it impossible to tell if you've started a new process or not, there's really no way around that.
This is one way to kill it, but it will close every open calculator.
It calls a no window command prompt and gives the command to close the Calculator.exe process.
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)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.