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
相关产品推荐
相关产品推荐

