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

时间:2016-12-16 14:17:01

标签: windows python-2.7 cmd subprocess executable

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

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”识别为ghostscript的内置缩写。所以我尝试以下方法:

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

好的,我是初学者,在这里犯了一些明显的错误。此外,"\b"之间的.20\bin\字符也会突出显示...向我表明我不知道这是一条单一路径。

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

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会让我的生活变得更轻松 - 但在我的公司环境中我并没有完全拥有那个选项。任何帮助将不胜感激!

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

编辑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 executable :)。

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

2 个答案:

答案 0 :(得分:2)

路径在此处包含空格Program Files。 通常,空间表示路径的末端。 在路径周围使用引号"告诉操作系统不要将空格视为路径的末尾,而是将引号之间的所有文本作为路径。 所以只需添加引号:

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

答案 1 :(得分:0)

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