subprocess.check_output调用ffprobe报CalledProcessError但错误为空,终端可正常运行
解决subprocess调用ffprobe返回非零退出码的问题
问题根源
终端执行命令时,csv="p=0"的引号是shell用来防止参数被拆分的语法,但用subprocess列表传参时,每个元素本身就是独立参数,不需要额外添加引号。你当前传入的csv="p=0"会被ffprobe当作完整的格式参数,它无法识别带引号的"p=0",因此触发错误退出。
修复代码
将参数中的'csv="p=0"'改为'csv=p=0'即可正常运行:
import subprocess try: duration_output = subprocess.check_output( ['ffprobe', '-i', 'test.m4a', '-show_entries', 'format=duration', '-v', 'quiet', '-of', 'csv=p=0'] ) # 解码并去除多余空白字符 print(duration_output.decode().strip()) except subprocess.CalledProcessError as err: print(f"退出码错误: {err.returncode}")
为什么错误详情是空字节串
因为你添加了-v quiet参数,ffprobe会关闭所有输出(包括错误信息),所以捕获到的错误输出为空。如果需要排查问题,可以临时移除-v quiet,或者在check_output中加入stderr=subprocess.STDOUT,让错误信息和标准输出合并返回:
import subprocess try: output = subprocess.check_output( ['ffprobe', '-i', 'test.m4a', '-show_entries', 'format=duration', '-of', 'csv="p=0"'], stderr=subprocess.STDOUT ) except subprocess.CalledProcessError as err: # 打印具体错误信息 print(err.output.decode())
此时你会看到ffprobe返回的具体错误提示,比如Invalid option value "csv=\"p=0\"",能快速定位参数问题。
内容的提问来源于stack exchange,提问作者Leonardo the Vinchi
相关产品推荐
相关产品推荐

