最近的 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。
预先感谢您的帮助!
按照评论中的建议,如果您已经知道如何分隔参数,请直接使用参数列表!
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
属性