Python + ffmpeg TypeError:在字符串格式化期间不是所有参数都被转换

时间:2017-03-21 18:55:41

标签: python ffmpeg stdout popen

我将文件发送到python中的函数,并尝试将结果保存到变量中,但我一直收到该错误。

我已经查看了其他答案,但似乎没什么好看的。任何帮助表示赞赏:

def ffmpegLUFS(fileName):
    subprocess.Popen("ffmpeg -i %s -filter_complex ebur128 -f null - 2>&1 | grep -n '.*' | grep -A 5 'size' | grep 'I:' | cut -d ':' -f3-" % tuple(map(pipes.quote, sys.argv[1])),stdout=subprocess.PIPE,shell=True).communicate()[0]
    return
Traceback (most recent call last):
  File "/Volumes/videos/videos/DROP_BIN/CHRIS/POD_Workflow_Files/WebContent_Audio.py", line 30, in <module>
    sourceLUFS = ffmpegLUFS(sys.argv[1])
  File "/Volumes/videos/videos/DROP_BIN/CHRIS/POD_Workflow_Files/WebContent_Audio.py", line 18, in ffmpegLUFS
    subprocess.Popen("ffmpeg -i %s -filter_complex ebur128 -f null - 2>&1 | grep -n '.*' | grep -A 5 'size' | grep 'I:' | cut -d ':' -f3-" % tuple(map(pipes.quote, fileName)),stdout=subprocess.PIPE,shell=True).communicate()[0]
TypeError: not all arguments converted during string formatting

1 个答案:

答案 0 :(得分:1)

我不确定你要用这部分代码实现什么目标:

tuple(map(pipes.quote, sys.argv[1]))

Python map function接受一个函数和一个iterable,并返回一个通过将函数应用于可迭代 [1] 的每个元素而获得的列表。在您的情况下,iterable是一个字符串,字符串的元素是其字符,因此map(pipes.quote, sys.argv[1])的结果将是您的字符串中的字符列表,必要时引用。例如,如果sys.argv[1]长度为10个字符,则map(pipes.quote, sys.argv[1])将是长度为10的列表。

我只能在命令行字符串中看到一个%s占位符,所以除非sys.argv[1]恰好只包含一个字符,否则会遇到“并非所有参数转换...”异常,因为字符串中%s占位符的数量与您尝试放入字符串的值的数量不同。

在我看来,最简单的解决方法是删除对tuplemap的调用,而只使用pipes.quote(sys.argv[1])

[1] map()实际上可以使用多个迭代,但为了简单起见,我忽略了这一点。当给出两个参数时,它的行为就像我所描述的那样。