如何向 python 子流程添加选项

How to add options to python subprocess

我正在使用 Python 2.7.3。

我有一个函数 tesseract 作为命令行运行。一切正常,现在我想向命令 -l rus 添加一个新参数(表示俄语)。尽管这适用于我的命令行,但它似乎不适用于 Python。

命令行:

$ /usr/local/bin/tesseract /Users/anthony/Downloads/rus.png outfile -l rus && 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

上面的 returns "HOIIY nony HOIIY nony Hony no ecTb HHJICXQRI 6y11e" 这表明 -l rus 标志被忽略了。

问题

如何将以下命令作为 python 子进程执行?

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

您需要将 '-l rus' 参数拆分为两个单独的参数,以确保它被程序正确解析:

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

为此使用 str.split() or 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
)
process = subprocess.Popen('/usr/local/bin/tesseract '+path+' outfile -l rus', stdout=subprocess.PIPE, stderr=subprocess.STDOUT,shell=True)

你可以 运行 它与 shell=True