簡體   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