子进程在设定的时间后没有终止

时间:2014-10-15 23:57:39

标签: python

我一直在使用Python在大量.mp4文件上运行视频处理程序。视频处理程序(我没有编写也无法更改)一旦到达视频的最后一帧就不会退出,因此在循环中使用os.system(cmd)通过所有.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()

然而,Tracking程序仍未退出,因此我最终会同时打开大量视频。我只能通过强制退出每个单独的框架或通过使用kill -9 id作为该程序的特定实例的id来摆脱它们。我已经读过,建议不要使用shell=True,但我不确定这是否会导致此行为。

如何在一段时间后杀死Tracking程序?我是Python的新手,我不知道如何做到这一点。我考虑在os.system("kill -9 id")之后做sleep()之类的事情,但我不知道如何获得该程序的ID。

1 个答案:

答案 0 :(得分:2)

删除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()

如果它没有帮助,那么尝试创建一个新的进程组并将其杀死。请参阅How to terminate a python subprocess launched with shell=True