前提・実現したいこと
レンタルサーバー(Xserver)上の自作webアプリケーションで画像処理(resize, 圧縮)をしたいです。
発生している問題・エラーメッセージ
from flask_sqlalchemy import SQLAlchmey
が含まれるとimport cv2
がエラーしてしまう。
以下の該当のソースコードのtraceback
File "/home/xs000000/---.com/public_html/test/test.py", line 14, in index import cv2 File "/home/xs000000/venv3.6/lib64/python3.6/site-packages/cv2/__init__.py", line 5, in from .cv2 import * MemoryError
実際に運用しようとしているソースコードのtraceback
File "/home/xs000000/--.com/public_html/test/app.py", line 84, in index import cv2 File "/home/xs000000/venv3.6/lib64/python3.6/site-packages/cv2/__init__.py", line 5, in from .cv2 import * ImportError: numpy.core.multiarray failed to import
File "/home/xs000000/-----.com/public_html/test/app.py", line 146, in index img = from_fileStorage_to_nparray(img) File "/home/xs000000/-----.com/public_html/test/app.py", line 54, in from_fileStorage_to_nparray import cv2 File "/home/xs000000/venv3.6/lib64/python3.6/site-packages/cv2/__init__.py", line 5, in from .cv2 import * ImportError: libGLX.so.0: failed to map segment from shared object: Cannot allocate memory'
該当のソースコード
明らかに無関係と判断した部分は省略または簡潔にしています。
python
1# -*- coding: utf-8 -*- 2# NOTE cv2は関数内インポートしている. cgiエラーするため. 3from flask import Flask 4from flask_sqlalchemy import SQLAlchemy 5 6app = Flask(__name__) 7 8FOLDER = "uploads" 9FILENAME = "sample.jpg" 10PATH = f"./{FOLDER}/{FILENAME}" 11 12 13@app.route('/') 14def index(): 15 import cv2 16 17 img = cv2.imread(PATH) 18 img = cv2.resize(img, (100, 100)) 19 img = compress_img(img) 20 cv2.imwrite(PATH, img) 21 22 return "Wrote." 23 24 25def compress_img(img, quality=10, ch=1): 26 import cv2 27 success, img = cv2.imencode('.jpg', img, [int(cv2.IMWRITE_JPEG_QUALITY), quality]) 28 if not success: 29 return None 30 return cv2.imdecode(img, ch)
試したこと
-
上記のエラー
ImportError: numpy.core.multiarray failed to import
をgoogleで調べたところ, numpyをアップグレードすればよいとの情報が複数見つかりましたが、これ以上アップグレードができませんでした。おそらくXserverの環境によるもの, もしくはpythonのバージョンが3.6であるためだと考えました。 -
次にコードを削ったりしてみたところ, 以下の条件が重なることでエラーが発生していることが分かりました。
- databese.pyモジュールの
from flask_sqlalchemy import SQLAlchmey
- @app.routeでデコレートしている関数内で
import cv2
(前者は大幅にコードを書き換えなけらばならないため別の方法でデータベースを操作するのは避けたいです)
3.別の関数内でインポートし呼び出ししてみましたが、関数が呼び出されるとエラーImportError: libGLX.so.0: failed to map segment from shared object: Cannot allocate memory'
が発生してしまいました。このエラーをgoogleで調べましたが特に情報は発見できませんでした。メモリの不足かと思いましたがfrom flask_sqlalchemy import SQLAlchmey
がなければ正常に動作したので関係ないと判断しました。
知識が乏しく、エラーの内容には特に踏み込めませんでした。
現在の状態に至るまで
-
ローカル環境で正常に動作しているwebアプリケーションをXserverにアップロードしたところcgiエラー(500 Internal Server Error)が発生。
import numpy
import cv2
がなければ動作したためこの二つによるものと判明 -
googleで調べるとnumpyのマルチスレッドが原因であり, 以下のように環境変数でシングルスレッドにして, かつ関数内でimportすればよいとの情報が見つかり, numpyのimportによるエラーが解決
cgi
1import os 2os.environ['OPENBLAS_NUM_THREADS'] = "1"
補足情報(FW/ツールのバージョンなど)
linuxbrewでpythonをインストールしようとしましたがどうしても失敗してしまうのでvenvを使ってライブラリをインストールしました。さらにXserverではsudoコマンドの権限が与えられていないためこれ以上のpythonのバージョンアップはできません。
追記
freeコマンドの結果
total used free shared buff/cache available Mem: 527830880 11427176 502397556 626092 14006148 516403704 Swap: 23328924 0 23328924
あなたの回答
tips
プレビュー