【问题标题】:sending variables to subprocess call with spaces - python 2.7将变量发送到带有空格的子进程调用-python 2.7
【发布时间】:2016-02-26 22:34:27
【问题描述】:

我想将 ffmpeg 选项添加到变量中,然后在子进程调用中使用它。如果变量包含一个单词,一切都很好,但如果它包含多个单词,我会得到错误。我正在处理一个更大的脚本,我需要为某些编解码器提供额外的选项,例如这个。我怎样才能让它工作?

以下内容非常适合我:

import subprocess
import sys

video_codec = 'libx264'
output = sys.argv[1] + '.mkv'
subprocess.call(['ffmpeg',
            '-i',sys.argv[1], 
            '-c:v',video_codec,
            '-c:a','copy',         
            output])    

一旦我向video_options 介绍了新的选项/空格:

video_codec = "'libx264', '-pix_fmt', 'yuv420p'"

我收到一个 ffmpeg 错误:

Unknown encoder ''libx264', '-pix_fmt', 'yuv420p''

如果我删除双引号并使用 video_codec = 'libx264', '-pix_fmt', 'yuv420p'

我得到一个 python 错误: Traceback (most recent call last): File "testo.py", line 10, in <module> output])
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 524, in call return Popen(*popenargs, **kwargs).wait() File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 711, in __init__ errread, errwrite) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1308, in _execute_child raise child_exception TypeError: execv() arg 2 must contain only strings

【问题讨论】:

  • 有什么理由不能让一个字符串包含所有选项?例如'libx264, -pix_fmt, yuv420p'
  • 在我的主脚本中,我定义了一个可以添加不同变量的通用 ffmpeg 函数。我不想为每种使用情况都输入新的命令。由于并非每个命令都需要更改 pix_fmt,因此我宁愿将其添加到 video_codec 变量中。
  • 使用shlex
  • 参数列表的每个元素都是可执行文件中的单个参数。没有进行分词,因此完全保留了空格。如果你想添加额外的选项,你必须将它们添加到参数列表中,而不是尝试将它们嵌入到其他参数中——或者你可以构建一个字符串并使用shell=True 来恢复分词功能

标签: python python-2.7 ffmpeg subprocess


【解决方案1】:

Eric Renouf 说得对,但不要创建字符串,它不太可靠。你只需要像这样分解你的配置:

video_codecs = ['libx264', '-pix_fmt', 'yuv420p']
output = sys.argv[1] + '.mkv'
cmd_list = ['ffmpeg',
        '-i',sys.argv[1], 
        '-c:v']
cmd_list += video_codecs
cmd_list += ['-c:a','copy',         
        output]
subprocess.call(cmd_list)

我不确定顺序是否重要,所以我保留了它,如果顺序不重要,您可以将最后一行与第三行结合起来。

【讨论】:

  • 正是我想要的。它具有与我在 bash 中所做的非常相似的额外好处(我显然是 python 新手),所以我对这种方法非常满意。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2015-01-03
  • 2017-01-04
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多