Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python子进程如何传递subshell参数_Python_Python 3.x_Bash_Subprocess - Fatal编程技术网

Python子进程如何传递subshell参数

Python子进程如何传递subshell参数,python,python-3.x,bash,subprocess,Python,Python 3.x,Bash,Subprocess,我正在使用SoX将多个音频文件合并到一起 此命令在终端中工作 sox &(ls *.mp3) out.mp3 但是,如果我尝试在python脚本中通过调用subprocess.run()来使用它,则不会 subprocess.run(['sox', '$(ls *.mp3)', 'out.mp3']) > sox FAIL formats: can't open input file `$(ls *.mp3)': No such file or > directory

我正在使用SoX将多个音频文件合并到一起

此命令在终端中工作

sox &(ls *.mp3) out.mp3
但是,如果我尝试在python脚本中通过调用subprocess.run()来使用它,则不会

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处理这种情况。

您想使用
shell=True
强制
subprocess
通过shell解释器运行命令并解析通配符/sub命令。但是,这(取决于平台)强制要求将参数作为字符串传递,而不是作为参数列表传递。对于一种懒惰且不安全的方式,有很多限制

等等。使用
glob.glob
,可以不使用
shell=True

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")

如果收到
“无mp3文件”
消息,请检查当前目录。为输入目录使用参数总是好的,避免依赖当前目录(
glob.glob(os.path.join(input_目录,*.mp3'))

我想我误解了您使用
shell=True
的第一点,因为当我这样做时,我遇到了与sox FAIL sox相同的错误:没有指定足够的输入文件名。然而,如果没有它,它将完美地工作。