Python 子进程在设置的时间量后未终止

Python 子进程在设置的时间量后未终止,python,Python,我一直在使用Python在大量.mp4文件集合上运行视频处理程序。我没有编写并且无法更改的视频处理程序在到达视频的最后一帧时不会退出,因此在循环中使用os.systemcmd遍历所有的.mp4文件对我来说不起作用,除非我在每个视频结束后坐在那里杀死处理程序 我尝试使用在视频结束预定时间后终止的子进程来解决此问题: for file in os.listdir(myPath): if file.endswith(".mp4"): vidfile = os.path.join

我一直在使用Python在大量.mp4文件集合上运行视频处理程序。我没有编写并且无法更改的视频处理程序在到达视频的最后一帧时不会退出,因此在循环中使用os.systemcmd遍历所有的.mp4文件对我来说不起作用,除非我在每个视频结束后坐在那里杀死处理程序

我尝试使用在视频结束预定时间后终止的子进程来解决此问题:

for file in os.listdir(myPath):
    if file.endswith(".mp4"):
        vidfile = os.path.join(myPath, file)
        command = "./Tracking " + vidfile
        p = subprocess.Popen(command, shell=True)
        sleep(840)
        p.terminate()
然而,跟踪程序仍然没有退出,因此我最终同时打开了大量视频。我只能通过强制退出每个单独的帧或使用kill-9id作为程序特定实例的id来摆脱它们。我已经读到不建议使用shell=True,但我不确定这是否会导致这种行为

我怎样才能在一段时间后终止跟踪程序?我对Python非常陌生,不知道如何做到这一点。我正在考虑在睡眠后执行类似于os.systemkill-9 id的操作,但我也不知道如何获取程序的id。

Drop shell=True,使用p.kill终止进程:

import subprocess
from time import time as timer, sleep

p = subprocess.Popen(["./Tracking", vidfile])
deadline = timer() + 840
while timer() < deadline:
    if p.poll() is not None: # already finished
        break
    sleep(1)
else: # timeout
    try:
        p.kill()
    except EnvironmentError:
        pass # ignore errors
    p.wait()

如果没有帮助,那么试着创建一个新的进程组,并杀死它。请参阅。

使用。杀戮,看看你是否运气更好。另外,您运行的是什么系统?您可以按名称终止程序,不需要pidshell=True,这可能会导致此行为,具体取决于您的平台。当您使用它时,您没有实际进程的句柄,而是有shell的句柄。但实际上,为什么要在这里使用shell=True?为什么不直接用正确的方法来做,这和用错误的方法做一样简单,然后看看会发生什么?同时,跟踪输出到stdout或stderr是否有你可以使用的东西,或者计时真的是唯一一种可能,除了观察文件句柄之类的东西之外?当我这样做时,我得到了subprocess.Popen的一个错误:File/usr/lib/python2.7/subprocess.py,第679行,在uuu init uu errread,errwrite File/usr/lib/python2.7/subprocess.py,在u execute child raise exception OSError:[Errno 2]没有这样的文件或目录