如何向 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
。
我正在使用 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
。