Python调用subprocess/os.popen执行FFmpeg命令的问题求助
Python调用FFmpeg的问题解决
问题分析
- os.popen停滞:
os.popen会因FFmpeg输出缓冲区占满导致父进程阻塞,且该接口已被官方废弃,不建议使用。 - subprocess.Popen找不到文件:直接传入完整命令字符串时,
subprocess.Popen默认以shell=False模式运行,会把整个字符串当作单个可执行文件路径,自然找不到对应程序。
正确解决方案
方法1:使用参数列表(推荐,无安全风险)
将FFmpeg命令拆分为参数列表,避免shell解析,同时重定向输出避免阻塞,并等待任务完成后再执行后续代码:
import subprocess # 拆分命令为参数列表,每个参数单独作为列表元素 command = [ '/usr/bin/ffmpeg', '-i', inputf, '-b:a', '128K', '-vn', f'{output_directory}{youtube_id}.mp3' ] try: # 启动子进程,重定向输出避免阻塞 process = subprocess.Popen( command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) process.wait() # 等待FFmpeg处理完成 # 后续执行你的业务代码 print("FFmpeg处理完成,继续执行后续步骤") except Exception as e: print(f"FFmpeg执行出错:{e}")
方法2:使用shell=True(不推荐,存在注入风险)
若必须使用完整命令字符串,需设置shell=True,但注意当输入路径含特殊字符时会有安全隐患:
import subprocess fcommand = f'/usr/bin/ffmpeg -i {inputf} -b:a 128K -vn {output_directory}{youtube_id}.mp3' try: process = subprocess.Popen( fcommand, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) process.wait() print("FFmpeg处理完成,继续执行后续步骤") except Exception as e: print(f"执行出错:{e}")
关键注意事项
- 参数拆分:
subprocess.Popen在shell=False模式下必须传入参数列表,这是最安全且官方推荐的方式。 - 输出重定向:将
stdout和stderr重定向到subprocess.DEVNULL,可避免因输出缓冲区满导致的进程阻塞。 - 等待任务完成:通过
process.wait()确保FFmpeg处理结束后再执行后续代码,符合你的需求。
内容的提问来源于stack exchange,提问作者Nowski
相关产品推荐
相关产品推荐

