使用subprocess.Popen调用metaflac失败,疑为参数传递问题
问题分析与解决
你遇到的问题核心在于subprocess参数列表中多余的引号——当你用列表形式给subprocess.Popen传递参数时,不需要给--set-tag的键值对加引号,因为这些引号会被当成参数的一部分传递给metaflac,导致它无法正确解析标签规则。
为什么原来的写法不行?
你的setCmd里每个元素是类似'--set-tag="COMPOSER=J S Bach"'的字符串,这会让metaflac收到的参数是带双引号的完整字符串,它会把"COMPOSER当成标签名,J S Bach"当成标签值,完全不符合预期,自然无法正确执行。
而["metaflac", "--version"]能正常运行,是因为这个参数没有多余的引号,metaflac可以直接识别。
修正后的代码
把setCmd里的引号去掉,直接传递键值对即可:
setCmd = [ '--set-tag=COMPOSER=J S Bach', '--set-tag=ALBUM=Goldbergovske variace BWV 988', '--set-tag=TRACKNUMBER=01', '--set-tag=TITLE=Aria' ] pipe = subprocess.Popen(["metaflac"] + setCmd + [file], stdout=subprocess.PIPE)
补充说明
如果某些场景下你确实需要处理标签值里的特殊字符,也可以选择开启shell=True,但这种方式存在安全风险(比如文件名包含恶意字符时会被shell解析),不推荐在生产环境使用:
# 仅作示例,不推荐 cmd_str = f'metaflac {" ".join(setCmd)} {file}' pipe = subprocess.Popen(cmd_str, stdout=subprocess.PIPE, shell=True)
内容的提问来源于stack exchange,提问作者atapaka
相关产品推荐
相关产品推荐

