Python Subprocess如何传递subshel​​l参数

时间:2019-01-14 21:12:58

标签: python python-3.x bash subprocess

我正在使用 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

我发现这是由于subshel​​l操作引起的,但我不知道如何正确传递它。 正如其他帖子所建议的那样,我也尝试过传递参数shell=True,但随后它说

> sox FAIL sox: Not enough input filenames specified

我在同一个工作目录中,并且我也尝试提供完整路径,但也不起作用。
我可以编写一个bash脚本并调用它,但是我想知道如何在这种情况下使用Python。

1 个答案:

答案 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'))