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