在 Python 的子进程中使用 Windows 路径(指向可执行文件)[初学者]

Using a Windows path within Python's subprocess (point to an executable) [beginner]

我开始在安装了 cygwin (Python 2.7) 的 Windows 7 x64 机器上开发一个小的 pdf 到 jpg 脚本。以下完美运行:

import subprocess
filename = "test"
subprocess.check_output('gs -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o ' + filename + '-2800-%03d.jpg ' + filename + '.pdf', stderr=subprocess.STDOUT)

在我的 Windows 10 x64 非 Cygwin 机器 (Python 2.7) 上拉取此项目后,此代码错误,因为它不再将 "gs" 识别为内置短对于鬼脚本。所以我尝试以下操作:

import subprocess
filename = "test"
subprocess.check_output('C:\Program Files\gs\gs9.20\bin\gwin64c.exe -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o ' + filename + '-2800-%03d.jpg ' + filename + '.pdf', stderr=subprocess.STDOUT)

WindowsError: [Error 2] The system cannot find the file specified

好的,我是初学者,在这里犯了一些明显的错误。 .20\bin\ 之间的 "\b" 字符也被突出显示......向我表明我不知何故还没有明确这是一个单一的路径。

我也尝试过的事情(单独运行):

subprocess.check_output(r'C:\Program Files\gs\gs9.20\bin\gwin64c.exe -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o ' + filename + '-2800-%03d.jpg ' + filename + '.pdf', stderr=subprocess.STDOUT')

subprocess.check_output("C:\Program Files\gs\gs9.20\bin\gwin64c.exe -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o ' + filename + '-2800-%03d.jpg ' + filename + '.pdf', stderr=subprocess.STDOUT/s", shell=True)

我已阅读: * How to use the dir/s command in Python? * How to execute a command prompt command from python * wrapping cmd.exe with subprocess * Python subprocess does not take correct arguments * wrapping cmd.exe with subprocess 无济于事:( .

始终给出的错误是:

Traceback (most recent call last):
File "C:/Python/Project/projectx/manual_conversion/manual_conversion.py", line 16, in <module>
subprocess.check_output(r'C:\Program Files\gs\gs9.20\bin\gwin64c.exe -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o ' + filename + '-2800-%03d.jpg ' + filename + '.pdf', stderr=subprocess.STDOUT)
File "C:\Python\Python 2.7.12\lib\subprocess.py", line 567, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "C:\Python\Python 2.7.12\lib\subprocess.py", line 711, in __init__
errread, errwrite)
File "C:\Python\Python 2.7.12\lib\subprocess.py", line 959, in _execute_child
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

我完全理解这是菜鸟的东西 + 切换到 unix 会让我的生活更轻松 - 但在我的公司环境中我没有完全拥有那个选项 atm。任何帮助将不胜感激!

第一个问题,如果需要,请指出任何更改!

编辑 1:我也尝试过:

subprocess.check_output(r'C:\Program Files\gs\gs9.20\bin\gwin64c.exe -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o 2800-%03d.jpg test.pdf')

因为我认为我的变量连接可能会破坏命令...但这又会产生同样的错误。

编辑 2:将完整参数作为列表传递

subprocess.check_output([r'C:\Program Files\gs\gs9.20\bin\gswin64c.exe -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o 2800-%03d.jpg test.pdf'])

产生同样的错误。但是这个:

subprocess.check_output([r'C:\Program Files\gs\gs9.20\bin\gswin64c.exe'])

是否在 Windows 中启动 ghostscript。谢谢@lit 让我尝试,现在的新问题是如何将选项传递给 subprocess' check_output 可执行文件 :) .

仍然困扰我的是它在 Windows 系统上的工作有多简单,仅仅是因为它安装了 cygwin,以某种方式修改了 cmd 命名空间以识别 "gs"...

路径包含一个space这里Program Files。 通常,space 表示路径结束。 在路径周围使用引号 " 告诉操作系统不要将 space 视为路径的结尾,而是将引号之间的所有文本视为路径。 所以只需添加引号:

subprocess.check_output([r'"C:\Program Files\gs\gs9.20\bin\gswin64c.exe" -sDEVICE=jpeg -dPDFFitPage -g2800x3620 -o 2800-%03d.jpg test.pdf']) 

我遇到了与 subprocess.call() 类似的问题,让它工作的唯一方法是将整个命令拆分为适当的可执行文件和参数列表,例如subprocess.call(['mvn', '-f', f'{path_to}/pom.xml', 'clean', 'compile']).