杀死Popensubprocess

这是我第一次向社区发帖,但是我现在正在通过search大约2周的时间来学习。 我似乎已经走到了一个死路,似乎无法通过反复试验或者通过别人的阅读来find答案。

我现在要做的就是杀死Popen和shell自己创build的进程。 我必须补充说,我是编程新手,这是我第一个“真正的”世界任务。

我见过的解决scheme是创build一个组ID,但这是对于Unix,我在Windows上。 Popen.kill()和Popen.terminate()不会杀死shell的子节点。 由这段代码启动的程序不会退出,它的PID不同于shell的PID。 我愿意接受build议,因为我将这作为一种学习工具,并且将会有所成就。 一些其他的解决scheme并没有杀死这个过程。 我能够通过DOS和Python解释器杀死它,但是我必须从TASKLIST手动查找PID,然后键入它。我需要从这个程序中杀死它。

我构build这个代码来保存读取excel文档值的MathCad模板的多个文档,并用新文件名吐出保存的文档。 提前致谢。 请原谅你可能看到的任何新手编码的东西,因为我只是试图让我的脚湿。

额外的任务尝试和更新(2/26/2014):

尝试使用subprocess.call('TASKKILL …)而不是subprocess.Popen杀死程序。 它不会杀死shell创build的子项。 尝试用subprocess.call('….',shell = True)replaceproc = subprocess.Popen('….'shell = True)和SendKeys函数不再工作。 用kill_proc_tree函数尝试了psutil函数,并且popup了一个“EOFError:[WinError 10054]现有连接被远程主机强制closures”popup窗口。 孩子节目仍然不closures。

如果我删除kill / terminate / close命令并让程序运行,则proc.pid与os.getpid()不同。 如果我使用psutil.Process(proc.pid) – 它说当Python解释器将返回它的PID时进程不存在。 如果我从TASKLIST得到MathCadPrime.exe PID = 1111,并使用psutil.Process(1111).parent,则不显示父项。 这可能是为什么在shell上做TASKKILL不会closures孩子的原因? 我已经发布了我的代码,就像我写的代码一样,看看你的专家是否看到我不知道的东西。

#def kill_proc_tree(pid, including_parent=True): # parent = psutil.Process(pid) # for child in parent.get_children(recursive=True): # child.kill() # if including_parent: # parent.kill() import subprocess import win32api import win32com.client import time import os import signal import psutil # User files file = "C:\Directory\SubDirectory\file.mcdx" # Command line function # /B /D - No command line window or explorer window proc = subprocess.Popen('start /B /D \ "C:\Program Files\PTC\Mathcad\Mathcad Prime 2.0\" "MathcadPrime.exe" \ "C:\Directory\SubDirectory\file.mcdx"', shell=True) # Set and test for active window focus = False while (focus == False): focus = shell.AppActivate("MathCad Prime 2.0 - " + file) time.sleep(1) if (focus == True): break # Send MathCad Prime commands shell.SendKeys('%', 0) time.sleep(0.5) shell.SendKeys('c', 0) time.sleep(0.1) shell.SendKeys('c', 0) time.sleep(2.0) shell.SendKeys('%', 0) time.sleep(0.5) shell.SendKeys('f', 0) time.sleep(0.1) shell.SendKeys('s', 0) time.sleep(4.0) #Other methods to tried to kill children: #Method 1: #subprocess.call("TASKKILL /F /T /PID {pid}".format(pid=proc.pid)) #Method 2: #subprocess.Popen("TASKKILL /F /T /PID {pid}".format(pid=proc.pid)) #Method 3: #if (int(proc.pid) > 0): # os.kill(proc.pid, signal.SIGTERM) #Method 4 (used with kill_proc_tree): #proc1 = os.getpid() #kill_proc_tree(proc1) 

感谢所有帮助的人,你们帮助我得出结论。 与建议略有不同,但每次都完成工作。 我在家里,而不是在工作(所以我写我的头顶上),但基本上我所做的只是把TASKLIST写入一个文本文件,并过滤掉一串代码:

 os.chdir('C:\Code') subprocess.call('TASKLIST /fi "IMAGENAME eq MathcadPrime.exe" /nh /fo csv > task.txt) 

然后解析出PID:

 doc = open('task.txt', 'rt') parse = doc.read() listing = parse.split(",") PID = listing[1] PID = int(PID.replace('"','').replace("'","")) os.kill(PID, signal.SIGTERM) 

我希望这可以帮助别人。

我试过下面的代码,它为我工作:

 import subprocess import os,signal proc = subprocess.Popen('dir /S', shell=True) if (int(proc.pid) > 0): print "killing ",proc.pid print os.kill(proc.pid, signal.SIGTERM) 

另外我所观察到的是,如果从Popen启动的程序响应“Ctrl + C”,则可以使用signal.CTRL_C_EVENT关闭程序。 如果启动的程序没有响应该事件,则必须手动关闭。 我想,我的上面的代码工作,因为cmd.exe响应该事件。