我将文件发送到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
答案 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
占位符的数量与您尝试放入字符串的值的数量不同。
在我看来,最简单的解决方法是删除对tuple
和map
的调用,而只使用pipes.quote(sys.argv[1])
。
[1] map()
实际上可以使用多个迭代,但为了简单起见,我忽略了这一点。当给出两个参数时,它的行为就像我所描述的那样。