【发布时间】:2015-06-16 11:53:47
【问题描述】:
我有一个简单的脚本,它调用另一个 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 不可用
【问题讨论】:
-
Popen.terminate有什么问题?文档说它在 Windows 上进行了适当的 win api 调用。 -
我注意到当我运行 subprocess.Popen 时创建了两个进程。 “cmd.exe”和“python.exe”。我从 py_process.pid 中获取的 PID 指向“cmd.exe”。我只是在我的脚本中终止“cmd.exe”。我不清楚如何获取“python.exe”的 PID。
-
就是这样:python.exe 是 cmd.exe 的子项。我在我的 TASKKILL 命令中添加了“/T”开关,这也杀死了 python.exe 进程!
标签: python python-2.7