Командная программа не выполняется из подпроцесса 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
,