2015-05-03 1 views
0

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

Когда я запускаю программу в командной строке, она терпит неудачу. Код выполняет 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 quit

Опять же, я могу запустить c: ... gswin64 .exe без программы.

Любая помощь будет глубоко оценена.

+0

Предлагая избегать ошибок форматирования пути Windows, поместите файл c: \ Program Files \ gs \ gs9.16 \ bin в Windows PATH и не используйте C: \ ... в любом месте команды, которая будет выполнена. – belwood

ответ

1

Проблема, вероятно, в том, что пространство после программы в «Program Files» неправильно экранировано. Используйте некоторую функцию, такую ​​как

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

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

(пример функции взяты из here)

0

Я имел такую ​​же проблему на 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] 

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

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

Действительно, он работал с mans64's ming64's windres.