我正在尝试在目录中的所有WAV文件上运行ffmpeg
以将它们转换为mp3。当我从Fedora Linux机器上的命令行运行它时,此命令正常工作:
/usr/bin/ffmpeg -i "Name With Spaces.wav" Name_With_Spaces.mp3
其中Name With Spaces.wav
是当前目录中的文件。但是,在Python 3.2中运行在同一目录中:
import os
files = os.listdir()
os.execl('/usr/bin/ffmpeg', '-i \"' + files[0] + '\"', files[0][:-4].replace(' ', '_') + '.mp3')
给我错误(来自ffmpeg
):必须至少指定一个输入文件。我不明白为什么这不起作用,因为'-i \"' + files[0] + '\"'
评估为-i "Name With Spaces.wav"
而files[0][:-4].replace(' ', '_') + '.mp3'
评估为Name_With_Spaces.mp3
。
我尝试使用不同的引号转义空格,使用完整路径(如/home/.../music/Name\ With\ Spaces.wav
),并实际用真实文本替换参数,但没有任何效果。我怎样才能让它发挥作用?
答案 0 :(得分:1)
如果你想使用os.execl方法,你必须稍微修改你的语法,-i必须作为列表中的不同项目
import os
files = os.listdir()
# Separated the args to make it clear
args = '/usr/bin/ffmpeg', '-i', files[0], files[0][:-4].replace(' ', '_') + '.mp3'
# Yes, the binary appears twice
os.execl('/usr/bin/ffmpeg', *args)
各种exec *函数采用新的参数列表 程序加载到进程中。在每种情况下,第一个 参数作为自己的名称而不是作为自己的名称传递给新程序 用户可能在命令行上键入的参数。对于C 程序员,这是传递给程序的main()的argv [0]。对于 例如,os.execv('/ bin / echo',['foo','bar'])只会打印条形图 标准输出; foo似乎会被忽略。
来源https://docs.python.org/2/library/os.html#process-management
答案 1 :(得分:-1)
我认为它与os.execl
如何读取您发送的输入有关。从文档中,它将每个参数解释为一个单独的参数,而不是一组参数。因此,它在内部做的事情比" ".join()
你给它的论点更聪明。它可能会在您发送的每个参数中转义出引号外的任何空格。
解决问题的一种方法是拆分" -i"参数其余部分的参数的一部分:
os.execl('/usr/bin/ffmpeg', '-i', \"' + files[0] + '\", files[0][:-4].replace(' ', '_') + '.mp3')
为了理智,如果您使用os.system
执行相同的代码,它应该有效:
os.system(" ".join(['/usr/bin/ffmpeg', '-i \"' + files[0] + '\"', files[0][:-4].replace(' ', '_') + '.mp3']))
或者,您可以使用子流程:
import subprocess
subprocess.call(['/usr/bin/ffmpeg', '-i', \"' + files[0] + '\", files[0][:-4].replace(' ', '_') + '.mp3'])