Командная программа не выполняется из подпроцесса PYTHON

Я скачал программу на Python (PYPDFOCR), которая запускается через командную строку. PYPDFOCR имеет несколько зависимостей (скрипт-призрак, магию изображений и т. Д.)

Когда я запускаю программу в командной строке, она не работает. Код выполняет GhostScript со всеми своими аргументами, но я получаю сообщение об ошибке, что команда не распознается.

Если я перейду к командной строке, я смогу выполнить скрипт-призрак "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 без программы.

Любая помощь будет высоко оценена.

2 ответа

Возможно, проблема в том, что пробел после Программы в "Программных файлах" не был правильно заполнен. Используйте некоторые функции, такие как

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

чтобы избежать вашей команды, прежде чем начать процесс.

(Пример функции взят здесь)

У меня была такая же проблема на Windows с windres, Оказалось, что это windres проблема (MinGW64 4.8.3.20141208 из шоколада).

Я отладил в нем и обнаружил, что subprocess.Popen(cmd,**kw), cmd будучи списком с первой записью пути исполняемого файла, сопоставленного с _winapi.CreateProcess(executable, cmd, ...), с executable=None, Так что ошибка возникла из winapi.

В филиале Posix в subprocess есть

        if executable is None:
            executable = args[0]

чего нет в ветке windows. В качестве попытки я установилexecutable в **kw: все та же проблема.

Затем я нашел https://amindlost.wordpress.com/2012/06/09/mingw-windres-exe-cant-popen-error/.

На самом деле это работало с mys64 от msys2 windres,

Другие вопросы по тегам