我正在使用 SoX 编写脚本,以将多个音频文件合并在一起。
此命令可在终端机上运行
sox &(ls *.mp3) out.mp3
但是如果我尝试通过调用subprocess.run()在python脚本中使用它,则不会
subprocess.run(['sox', '$(ls *.mp3)', 'out.mp3'])
> sox FAIL formats: can't open input file `$(ls *.mp3)': No such file or
> directory
我发现这是由于subshell操作引起的,但我不知道如何正确传递它。
正如其他帖子所建议的那样,我也尝试过传递参数shell=True
,但随后它说
> sox FAIL sox: Not enough input filenames specified
我在同一个工作目录中,并且我也尝试提供完整路径,但也不起作用。
我可以编写一个bash脚本并调用它,但是我想知道如何在这种情况下使用Python。
答案 0 :(得分:1)
您要使用shell=True
来强制subprocess
通过shell解释器运行命令并解析通配符/子命令。但是,这(取决于平台)强加参数以字符串形式 传递,而不是以参数列表形式传递。懒惰和不安全的方式有很多限制。
等等。您可以使用shell=True
来不 glob.glob
:
subprocess.run(['sox'] + glob.glob('*.mp3') + ['out.mp3'])
最好检查当前文件夹中是否确实有 mp3
个文件,因此:
input_files = glob.glob('*.mp3')
if input_files:
subprocess.run(['sox'] + input_files + ['out.mp3'])
else:
raise Exception("No mp3 files")
如果收到"No mp3 files"
消息,请检查当前目录。在输入目录中使用参数总是很好,并且避免依赖当前目录(glob.glob(os.path.join(input_directory,'*.mp3'))
)