我一直在使用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。
答案 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。