我正在尝试终止一个单独使用多个线程的 Python 程序。
如果我没记错的话,只需
sys.exit()
就可以了。
但是,为了防止我犯许多错误,包括丢失对线程的引用,我尝试了以下方法:
subprocess.Popen(['start', 'cmd.exe', '/c', f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
我认为这是转义引号的问题,所以我尝试了几种方法但失败了。我放弃了并执行了以下操作,效果非常好。
with open('exit_self.bat', 'w') as file:
file.write(f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"&del exit_self.bat')
subprocess.Popen(['start', 'cmd.exe', '/c', 'exit_self.bat'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
没有临时文件怎么办?我错过了什么?作为参考,我使用
/k
代替 /c
的 cmd.exe
选项离开窗口并检查窗口中的错误消息,如下:
Waiting for 0 seconds, press a key to continue ...
ERROR: Invalid argument/option - 'eq'.
Type "TASKKILL /?" for usage.
我不确定它是否有帮助,但我添加了
echo
来查看正在执行的命令的语法:
subprocess.Popen(['start', 'cmd.exe', '/k', 'echo', f'timeout 5&taskkill /f /fi "PID eq {os.getppid()}"'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
结果是:
"timeout 5&taskkill /f /fi \"PID eq 3988\""
subprocess.Popen
::
args 应该是程序参数的序列,或者是单个字符串或类似路径的对象。
我运行了 notepad.exe,记下它的 PID (3840) 并使用了单个字符串。 请注意,使用
shell=True
,您不需要 start cmd.exe /c
:
import subprocess
p = subprocess.Popen('timeout 5&taskkill /f /fi "PID eq 3840"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
x = p.communicate()
print(x)
输出(记事本被杀):
(b'\r\nWaiting for 5 seconds, press a key to continue ...\x084\x083\x082\x081\x080\r\nSUCCESS: The process with PID 3840 has been terminated.\r\n', b'')