首页 > 解决方案 > Python运行带有子进程的cm​​d命令(ffmpeg)并在执行某些代码之前等待cmd关闭

问题描述

所以我使用 ffmpeg 来调整视频的大小,这需要一点时间,所以在代码继续之前我必须等待 cmd 关闭。我还没有找到解决方案,我希望真正了解他们的东西的人可以教我一种方法。我可能只是在做一些迟钝的事情......无论如何,我已经尝试了多种方法,例如使用 subprocess.Propen() 然后使用 pope() 来查看它何时不返回“None”,还尝试了 subprocess.run() 和 subprocess.CompletedProcess 之类的东西()但我无法让它工作,有人可以解释一下是否有办法做到这一点,而我只是做错了吗?:)

这是我尝试过的一个例子

p = subprocess.Popen("start ffmpeg -y -i "+DIR+"/post.mp4 -vf scale="+str(nW)+":"+str(nH)+" "+DIR+"/post_r.mp4", shell=True)
    while p.poll() is None:
        time.sleep(1)
        print("alive")
    else:
        print("cmd exited")

同样,每当我输入 shell=False 时,它​​就会立即中断,并且出现此错误: FileNotFoundError: [WinError 2] The system cannot find the file specified

标签: pythonffmpegsubprocess

解决方案


subprocess.Popen()如果您只是需要在等待时运行该进程,请不要使用。Legacysubprocess.call()或 Modernsubprocess.run()正是为此用例设计的。

您需要自己将shell=False命令行拆分为列表。您可以shlex.split()为方便起见打电话,但自己做并不难。

subprocess.run(['ffmpeg', '-y', '-i', DIR+"/post.mp4",
    '-vf', 'scale=' + str(nW) + ":" + str(nH), DIR+"/post_r.mp4"])

start看起来你在 Windows 上,当然这start也是 shell 的一个特性;如果您没有外壳,start则不可用(但也没有用)。


推荐阅读