【问题标题】:Python Subprocess how to pass subshell argumentPython子进程如何传递子shell参数
【发布时间】:2019-01-14 21:12:57
【问题描述】:

我正在编写一个使用 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

我的图像是因为子shell操作,但我不知道如何正确传递它。 正如其他一些帖子所建议的那样,我也尝试过传递参数shell=True,但随后它说

> sox FAIL sox: Not enough input filenames specified

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

【问题讨论】:

    标签: python python-3.x bash subprocess


    【解决方案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'))

    【讨论】:

    • 我想我误解了您使用shell=True 的第一点,因为当我这样做时,我遇到了与> sox FAIL sox: Not enough input filenames specified 相同的错误。但是没有它就可以完美运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多