使用空格将变量发送到子进程调用 - python 2.7

时间:2015-11-24 13:03:09

标签: python python-2.7 ffmpeg subprocess

我想将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

1 个答案:

答案 0 :(得分:2)

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)

我不确定订单是否重要,所以我保留在这里,如果订单无关紧要,你可以将最后一行与第三行合并。