【问题标题】:Command program not executing from PYTHON subprocess命令程序未从 PYTHON 子进程执行
【发布时间】:2015-11-25 22:52:42
【问题描述】:

我下载了一个通过命令行运行的 python 程序 (PYPDFOCR)。 PYPDFOCR 有几个依赖项(ghost script、image magick 等)

当我在命令行中执行程序时,它失败了。该代码使用其所有参数执行 GhostScript,但我收到命令无法识别的错误。

如果我去命令行,我可以执行ghost脚本“C:\Programs.....\gswin64c.exe”并传递参数并得到结果。但是,当我运行 PYPDFOCR 时,它每次都失败。

 def _run_gs(self, options, output_filename, pdf_filename):
    try:
        cmd = '%s -q -dNOPAUSE %s -sOutputFile="%s" "%s" -c quit' % (self.binary, options, output_filename, pdf_filename)
        logging.info(cmd)        
        out = subprocess.check_output(cmd, shell=True)

    except subprocess.CalledProcessError as e:
        print e.output
        if "undefined in .getdeviceparams" in e.output:
            error(self.msgs['GS_OUTDATED'])
        else:
            error (self.msgs['GS_FAILED'])

我在命令中得到的错误是“C\Program”不是内部或外部命令、可运行程序或批处理文件。

当我打印命令的内容时,它显示:

c:\Program File\gs\gs9.16\bin\gswin64c.exe" -q -dNOPAUSE -sDEVICE=j[ecgray -dJPEG=75 -r300 -sOutputFILE="C:\test\a3_ %d.jpg "c:\test\a3.pdf" -c 退出

同样,我可以在没有程序的情况下运行 c:...gswin64.exe 命令。

任何帮助将不胜感激。

【问题讨论】:

  • 建议避免 Windows 路径格式错误,将 c:\Program File\gs\gs9.16\bin 放在 Windows PATH 中,不要在任何地方使用 C:\...要执行的命令。

标签: python subprocess command-line-arguments ghostscript


【解决方案1】:

问题可能是“Program Files”中Program后面的空格没有正确转义。使用一些功能,如

def shellquote(s):
    return "'" + s.replace("'", "'\\''") + "'"

在开始进程之前转义您的命令。

(取自here的示例函数)

【讨论】:

    【解决方案2】:

    windres 在 Windows 上遇到了同样的问题。 原来是windres 问题(MinGW64 4.8.3.20141208 from Chocolatey)。

    我调试进去发现subprocess.Popen(cmd,**kw), cmd 是第一个条目可执行文件路径的列表, 映射到_winapi.CreateProcess(executable, cmd, ...),与executable=None。 所以错误源于winapi。

    subprocess 的 Posix 分支中有

            if executable is None:
                executable = args[0]
    

    windows 分支中缺少的。 作为尝试,我在 **kw 中设置了executable:仍然是同样的问题。

    然后我找到了https://amindlost.wordpress.com/2012/06/09/mingw-windres-exe-cant-popen-error/

    确实,它适用于 msys2 的 ming64 的 windres

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 1970-01-01
      • 2015-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 2019-03-06
      • 1970-01-01
      相关资源
      最近更新 更多