You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用ffprobe处理含空格文件名时subprocess执行失败问题

Python调用ffprobe处理带空格文件名的问题

问题场景

我正在编写Python脚本,用于批量处理并重命名视频,需要调用ffprobe获取视频内容信息。在终端命令行中,ffprobe支持两种方式处理含空格的文件名:用单引号包裹,或对空格转义,以下两个命令均可正常执行:
ffprobe 'deleteMe 2.mp4'
ffprobe deleteMe\ 2.mp4

但以下Python代码中,仅不含空格的文件名示例可正常运行,其余两个含空格的示例均返回No such file or directory错误:

fileName = 'deleteMe.mp4'
fileString = fileName.replace(' ','\ ')
result1 = subprocess.run(['ffprobe', fileString], capture_output=True, encoding='UTF-8')
print(result1.stderr)

fileName = 'deleteMe 2.mp4'
fileString = fileName.replace(' ','\ ')
result2 = subprocess.run(['ffprobe', fileString], capture_output=True, encoding='UTF-8')
print(result2.stderr)

fileString = '\'' + fileName + '\''
result3 = subprocess.run(['ffprobe', fileString], capture_output=True, encoding='UTF-8')
print(result3.stderr)

问题原因

使用subprocess.run的列表参数形式时,Python会直接将每个列表元素作为独立参数传递给ffprobe,无需像终端shell那样做转义或添加引号——这些解析工作是终端shell的职责,Python已经跳过了shell解析环节:

  • 给文件名添加转义符\ ,会导致ffprobe寻找名字中实际包含\字符的文件,自然无法找到目标文件;
  • 给文件名包裹单引号,会让ffprobe将带引号的字符串视为完整文件名,而实际文件名并不包含引号,因此同样找不到。

正确解决方法

推荐写法:直接传递原始文件名

无需对文件名做任何处理,直接将原始文件名作为列表的第二个参数传入即可,Python会自动处理空格问题:

fileName = 'deleteMe 2.mp4'
result = subprocess.run(['ffprobe', fileName], capture_output=True, encoding='UTF-8')
print(result.stderr)

备选写法:启用shell解析(不推荐)

如果确实需要依赖shell解析逻辑(存在安全风险,谨慎使用),可以添加shell=True参数,同时将整个命令拼接为一个字符串,格式与终端命令一致:

fileName = 'deleteMe 2.mp4'
# 空格转义写法
cmd = f"ffprobe {fileName.replace(' ', '\\ ')}"
result = subprocess.run(cmd, shell=True, capture_output=True, encoding='UTF-8')

# 单引号包裹写法
cmd = f"ffprobe '{fileName}'"
result = subprocess.run(cmd, shell=True, capture_output=True, encoding='UTF-8')

注意:这种方式下,如果文件名包含单引号会出现解析错误,且shell=True可能带来命令注入风险,因此优先使用列表参数的写法。

内容的提问来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:01:08