我有一个简单的脚本,它调用另一个 python 脚本作为子进程。我可以确认子进程已启动并且可以获取其 PID。
当我尝试终止子进程(在 win 中)时,我收到针对正确 PID 的 SUCCESS 消息,但 Windows 任务管理器显示第二个 python.exe 进程仍在运行。
对于在 Win 中完成此任务有什么建议吗?我最终会将其扩展到 OSX 和 Linux 中:
简化:
#!/usr/bin/env python
import os, sys
import subprocess
from subprocess import Popen, PIPE, STDOUT, check_call
pyTivoPath="c:\pyTivo\pyTivo.py"
print "\nmyPID: %d" % os.getpid()
## Start pyTivo ##
py_process = subprocess.Popen(pyTivoPath, shell=True, stdout=PIPE, stderr=subprocess.STDOUT)
print "newPID: %s" % py_process.pid
## Terminate pyTivo ##
#py_process.terminate() - for nonWin (?)
py_kill = subprocess.Popen("TASKKILL /PID "+ str(py_process.pid) + " /f")
raw_input("\nPress Enter to continue...")
注意:需要Python2.7,psutils不可用
最佳答案
在我的实现中,以下内容实际上在 Windows 中创建了两个进程(“cmd.exe”和“python.exe”)。
py_process = subprocess.Popen(pyTivoPath, shell=True, stdout=PIPE, stderr=subprocess.STDOUT)
注意到“python.exe”进程是“cmd.exe”进程的子进程,我将“/T”(树终止)开关添加到我的 TASKKILL 中:
py_kill = subprocess.Popen("TASKKILL /PID "+ str(py_process.pid) + " /f /t")
这会产生有效杀死 python 子进程的预期效果。
关于Python:终止子进程=成功,但它仍在运行(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30866819/