Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何杀死python中的所有子进程_Python_Windows_Subprocess_Popen - Fatal编程技术网

如何杀死python中的所有子进程

如何杀死python中的所有子进程,python,windows,subprocess,popen,Python,Windows,Subprocess,Popen,在python中,我打开了4个子流程。现在我想在python脚本中出现新请求时终止所有以前的进程 我正在使用Python2.7和Windows7操作系统 谢谢,您可以使用os.kill功能 import os os.kill(process.pid) 如果使用subprocess.Popen函数打开子流程,则已返回流程id。但如果使用shell=True标志,请小心,因为在这种情况下,进程pid将是shell进程id。如果这是您的情况,则是可行的解决方案。在生成子进程的主python脚本中,使

在python中,我打开了4个子流程。现在我想在python脚本中出现新请求时终止所有以前的进程

我正在使用Python2.7和Windows7操作系统


谢谢,

您可以使用
os.kill
功能

import os
os.kill(process.pid)

如果使用
subprocess.Popen
函数打开子流程,则已返回流程id。但如果使用
shell=True
标志,请小心,因为在这种情况下,进程pid将是shell进程id。如果这是您的情况,则是可行的解决方案。

在生成子进程的主python脚本中,使用它发送/传递事件对象,并在主进程中使用事件保留子进程的引用

示例代码:

from multiprocessing import Process, Event

# sub process execution point
def process_function(event):
    # if event is set by main process then this process exits from the loop
    while not event.is_set():
        # do something

# main process

process_event = {}  #  to keep reference of subprocess and their events
event = Event()
p = Process(target=process_function, args=(event))
p.start()
process_event[p] = event

# when you want to kill all subprocess
for process in process_event:
    event = process_event[process]
    event.set()
编辑

正如您对问题所作的评论,我认为它在您使用subprocess.Popen的场景中不是很有用。但这是一个很好的技巧,尽管假定您想杀死所有子进程而不跟踪它们,外部库psutil使这变得很容易:

   import os
   import psutil
   # spawn some child processes we can kill later
   for i in xrange(4): psutil.Popen('sleep 60')

   # now kill them
   me = psutil.Process(os.getpid())
   for child in me.get_children():
       child.kill()

您是如何生成这4个子流程的?到目前为止您尝试了什么?实际上,我的目标是当新的流程请求出现时,需要停止以前的流程。什么是分派子流程?如果要终止以前的进程,这些进程的发起人(所有者)将拥有终止它们所需的信息。例如,我有两个进程,p=subprocess.Popen(“echo t |”,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.stdout)p1=subprocess.Popen([svn,“list”,“-R”,Url],shell=True,stdin=p.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)。communicate(),现在我需要在新请求到来时终止这两个进程。请将格式化的代码放入您的问题中。评论和重要信息中的内容很难阅读。是的,我正在使用Shell=True标志。那么这可以帮助您了解os.killpg是否在windows中工作?我不确定您是否必须尝试它。这不会杀死孩子当我使用此代码时,我得到的是eror:WindowsError:[错误32]进程无法访问该文件,因为另一个进程正在使用它:“abc.txt”这很奇怪。。。脑海中出现的几个选项-1。您的系统上没有sleep.exe(尽管这不是错误32),2。也许它会受到其他代码的影响。你有没有在口译员那里试过?