Как добавить параметры в подпроцесс python

#python #python-3.x #shell #subprocess

Вопрос:

Я использую Python 2.7.3.

У меня есть функция, которая запускается tesseract как командная строка. Все работает нормально, и теперь я хотел бы добавить в команду новый параметр -l rus (обозначающий русский язык). Несмотря на то, что это работает в моей командной строке, похоже, что это не работает с Python.

Командная строка:

 $ /usr/local/bin/tesseract /Users/anthony/Downloads/rus.png outfile -l rus amp;amp; more outfile.txt
Tesseract Open Source OCR Engine v3.02.02 with Leptonica
Полу-Милорд, полу-купец,
Полу-мудрец, полу-невежда,
Полу-подлец, но есть надежда,

Что будет полным наконец.
 

Функция Python

   def ocr(self,path):
      path = "/Users/anthony/Downloads/rus.png"
      process = subprocess.Popen(['/usr/local/bin/tesseract', path,'outfile','-l rus'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
      out, err = process.communicate()
      print err
      print out
      with open('outfile.txt', 'r') as handle:
          contents = handle.read()
      os.remove(temp.name   '.txt')
      os.remove(temp.name)

      return contents, out
 

приведенное выше возвращает «HOIIY nony HOIIY nony Hony no ecTb HHJICXQRI 6y11e», что говорит о том, что -l rus флаг игнорируется.

Вопрос

Как я могу выполнить следующую команду в качестве подпроцесса python?

 /usr/local/bin/tesseract /Users/anthony/Downloads/rus.png outfile -l rus
 

Комментарии:

1. You probably want ‘-l’, ‘rus’, генерал-губернатор.

Ответ №1:

Вам нужно разделить '-l rus' аргумент на два отдельных, чтобы убедиться, что программа правильно его проанализировала:

 process = subprocess.Popen(
    ['/usr/local/bin/tesseract', path, 'outfile', '-l', 'rus'],
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)
 

Это может быть удобно использовать str.split() или shlex.split() для этого:

 cmd = '/usr/local/bin/tesseract /Users/anthony/Downloads/rus.png outfile -l rus'

process = subprocess.Popen(
    cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT
)
 

Ответ №2:

 process = subprocess.Popen('/usr/local/bin/tesseract ' path ' outfile -l rus', stdout=subprocess.PIPE, stderr=subprocess.STDOUT,shell=True)
 

Вы можете запустить его с shell=True помощью .