gpt4 book ai didi

python - 使用 glob 通过 subprocess.run() 生成参数

转载 作者:行者123 更新时间:2023-12-01 09:25:52 24 4
gpt4 key购买 nike

我想在 python 脚本中使用 metaflac ( https://linux.die.net/man/1/metaflac ) 命令。

from subprocess import run

flac_files = "/home/fricadelle/Artist - Album (2008)/*.flac"
run(['metaflac', '--add-replay-gain', flac_files])

我明白

The FLAC file could not be opened.  Most likely the file does not exist

或者不可读。

如果我将 shell = True 添加到 run 函数中,我会得到:

ERROR: you must specify at least one FLAC file;
metaflac cannot be used as a pipe

那我做错了什么?谢谢!

PS:当然,该命令在 shell 中运行良好:

metaflac --add-replay-gain /home/fricadelle/Artist\ -\ Album \(2008\)/*.flac

最佳答案

除非您指定shell=True(并且作为第一个近似值,您永远不应该指定shell=True),否则您提供的参数将按原样传递,不带任何参数。 shell 扩展、分词或取消引用。因此,您作为参数传递的文件名正是 /home/fricadelle/Artist - Album (2008)/*.flac,这不是任何文件的名称。 (这就是为什么你不需要在空格和括号之前添加反斜杠。如果你指定了 shell=True ——我重复一遍,你真的应该避免这种情况 ——那么你需要包含反斜杠这样 shell 就不会将名称分割成几个不同的单词。)

当您输入
flac_files = "/home/fricadelle/Artist - Album (2008)/*.flac
在 shell 中未加引号,shell 将尝试将其扩展为名称与模式匹配的所有文件的列表,然后将该列表作为单独的参数传递。由于 subprocess.run 不执行此操作,因此您必须自己执行此操作,通常使用 glob.glob 执行此操作。例如,

from subprocess import run
from glob import glob
flac_files = "/home/fricadelle/Artist - Album (2008)/*.flac"
run(['metaflac', '--add-replay-gain'] + glob(flac_files))

注意:与 shell 不同,如果模式没有匹配任何文件,glob.glob 将返回一个空列表。您确实应该检查此错误,而不是调用没有文件名选项的 metaflac

关于python - 使用 glob 通过 subprocess.run() 生成参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50401312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com