Python 子进程传递参数错误

问题描述 投票:0回答:1

最近的 python 版本似乎发生了一些变化,引入了 subprocess.run 解析参数的不同行为。一条运行多年的线路现在停止运行了。 现在,我的 python 脚本包装了 LaTex Songs 和 lilypond 来生成和弦表。在遇到 python 版本和 lilypond 捆绑的 python 问题后,我设置了一切以重新开始。也许问题根本不在于 python,而在于 lilypond,但是,我询问了通常响应迅速的 lilypond 支持,但没有得到帮助。

所以,问题来了:

command = "lilypond-book.py --output="+args.output+" --pdf -lERROR --lily-loglevel=ERROR "+f
print(command)

打印:

lilypond-book.py --output=C:\Users\xxx\Desktop\Tools\Songbook\Sample\pyOut --pdf -lERROR --lily-loglevel=ERROR book_general.lytex

将该输出粘贴回 shell 效果很好。 但是,执行

subprocess.run(command,shell=True)
会导致错误:

lilypond-book.py: error: file not found:  --output=C:\Users\xxx\Desktop\Tools\Songbook\Sample\pyOut --pdf -lERROR --lily-loglevel=ERROR book_general.lytex

似乎使用 subprocess 搞乱了 lilypond-book.py 的参数解析,它忽略了参数并将整个命令视为“文件”。我还尝试了使用逗号分隔参数的首选 subprocess.run 方法,但得到了相同的错误。 现在我真是一头雾水了

我使用的是Python 3.12.2,之前安装的版本是3.7,IIRC。 Lilypond 是 2.24.4。操作系统是Windows 10。

预先感谢您的帮助!

python subprocess lilypond
1个回答
0
投票

按照评论中的建议,如果您已经知道如何分隔参数,请直接使用参数列表!

p = subprocess.run(
    [
        "lilypond-book.py",
        "--output=C:\Users\xxx\Desktop\Tools\Songbook\Sample\pyOut",
        "--pdf",
        "-lERROR",
        "--lily-loglevel=ERROR book_general.lytex"
    ],
)
p.check_returncode()  # check for success

如果您有一个完整或部分字符串,由于某种原因您不想自己解析,则可以使用

shlex.split()
来获得类似 shell 的分割

如果您想收集输出以供其他用途,请传递

stdout=subprocess.PIPE, stderr=subprocess.PIPE
,它将分别填充结果
CompletedProcess
.stderr
.stdout
属性

更多来自官方文档https://docs.python.org/3/library/subprocess.html

© www.soinside.com 2019 - 2024. All rights reserved.