python - Python运行带有子进程的cmd命令(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
解决方案
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
则不可用(但也没有用)。
推荐阅读
- c# - 查找多个Array中匹配元素的所有索引
- python - 如何与网站的界面交互以及如何在 Python 中调用程序?
- javascript - 来自 Google 或 Microsoft 的 JQuery uiLock
- html - Html5音频元素多源下载偏好
- sql - 选择满足条件的行
- rpy2 - rpy2 如何调用 as.matrix()
- java - 如何为Meet-In-The-Middle攻击制作一个集合?
- typo3 - TYPO3 插件上的条件 Symfony 表达式语言
- ruby - 让 Thor 显示顶级命令的消息
- javascript - PHP会话/json/javascript