複数の場所から処理する画像を送信できるように、OCR Web サービスをセットアップしようとしています。
私は cgi で何もしたことがないので、mod_wsgi を試す時が来たと言いました。すべてのライブラリとopencvとpytesseractをインストールするのに、2日ほどかかりました。「通常の方法」(新しいpythonウィンドウインタープリターを開始)で実行すると、OCRは正常に機能します。一部のライブラリが正常に動作しているにもかかわらず、mod_wsgi で動作させるのに多くの問題がありました。
私はpytessearchで立ち往生しました。私がそれを実行すると:
tesseract -l myl image.jpe out
すべての作品ファイル。
私がこのようにしても:
import pytessearct
from PIL import Image
pytesseract.image_to_string(Image.open('/var/www/path/image.jpe'), lang='myl')
これも同様に機能します。
mod_wsgi を使用してこれを行うと、httpd ログファイルに次のエラーが記録されます。
mod_wsgi (pid=1836): Exception occurred processing WSGI script '/var/www/path/app.wsgi'.
[Mon May 18 06:28:31 2015] [error] [client IP] Traceback (most recent call last):
[Mon May 18 06:28:31 2015] [error] [client IP] File "/var/www/path/app.wsgi", line 28, in wsgi_app
[Mon May 18 06:28:31 2015] [error] [client IP] output = check_text('a.jpe')
[Mon May 18 06:28:31 2015] [error] [client IP] File "/var/www/path/app.wsgi", line 20, in check_text
[Mon May 18 06:28:31 2015] [error] [client IP] return pytesseract.image_to_string(Image.open('/var/www/path/a.jpe'), lang='myl')
[Mon May 18 06:28:31 2015] [error] [client IP] File "/usr/local/lib/python2.7/site-packages/pytesseract/pytesseract.py", line 161, in image_to_string
[Mon May 18 06:28:31 2015] [error] [client IP] boxes=boxes,
[Mon May 18 06:28:31 2015] [error] [client IP] File "/usr/local/lib/python2.7/site-packages/pytesseract/pytesseract.py", line 94, in run_tesseract
[Mon May 18 06:28:31 2015] [error] [client IP] stderr=subprocess.PIPE)
[Mon May 18 06:28:31 2015] [error] [client IP] File "/usr/local/lib/python2.7/subprocess.py", line 710, in __init__
[Mon May 18 06:28:31 2015] [error] [client IP] errread, errwrite)
[Mon May 18 06:28:31 2015] [error] [client IP] File "/usr/local/lib/python2.7/subprocess.py", line 1335, in _execute_child
[Mon May 18 06:28:31 2015] [error] [client IP] raise child_exception
[Mon May 18 06:28:31 2015] [error] [client IP] OSError: [Errno 2] No such file or directory
ここに私のapp.wsgiファイルがあります:
#!/usr/local/bin python2.7
#-*- coding: utf-8 -*-
import os
import sys
from subprocess import check_output
sys.path.append('/var/www/path')
import pytesseract
from PIL import Image
def check_text(image_path):
# return check_output(['pytesseract', '-l', 'myl', '/var/www/path/a.jpe'])
return pytesseract.image_to_string(Image.open('/var/www/path/a.jpe'), lang='myl')
def wsgi_app(environ, start_response):
output = sys.version.encode('utf-8')
status = '200 OK'
headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
output = check_text('a.jpe')
start_response(status, headers)
return os.getcwd()
return output
# mod_wsgi need the *application* variable to serve our small app
application = wsgi_app
ソースでわかるように、サブプロセスからの check_output を使用して、新しい pytesseract プロセスを自分で開始しようとしましたが、同じエラーが発生します。
ソースから tesseract と mod_wsgi をビルドしました。しかし、これもまた mod_wsgi と何か関係があると確信しています。なぜなら、私が Python で通常どおり実行すると機能するからです。
更新: mod_wsgi と opencv で同様の「奇妙な」問題が発生しました。質問と回答はここにあります: mod_wsgi django アプリから numpy をインポートするときの ctypes エラー
任意の提案をいただければ幸いです。