Django4.2からデータモデルのマイグレーションにdb_commentが追加されてドキュメントに便利なので喜んでアップグレードしたところ、Apache+mod_wsgiのWebアプリケーション経由で動かしていたrembgのimportでエラーが発生して動かなくなった時の解決方法の共有です。
環境はAmazonLinux2023ですがCentOS7以降でも同じだと思います。
pip install --upgrade djangoでアップグレードしたところ依存パッケージもアップグレードしてしまい、500 Internal server errrorになってしまいdjangoのコマンドやrunserverではエラーが発生しません。
以下のランタイムエラーが/var/log/httpd/error_logに出ています。
RuntimeError: cannot cache function '_make_tree': no locator available for file '/home/ec2-user/.pyenv/versions/3.10.11/lib/python3.10/site-packages/pymatting/util/kdtree.py'
トレースバックを追うと以下のようにfrom rembg import remove
のところでこけていました。
from rembg import remove
/home/hoge/.pyenv/versions/3.10.11/lib/python3.10/site-packages/rembg/bg.py", line 16, in <module>
from pymatting.alpha.estimate_alpha_cf import estimate_alpha_cf
...(略)...
disp.enable_caching()
File "/home/hoge/.pyenv/versions/3.10.11/lib/python3.10/site-packages/numba/core/dispatcher.py", line 863, in enable_caching
...(略)...
File "/home/hoge/.pyenv/versions/3.10.11/lib/python3.10/site-packages/numba/core/caching.py", line 337, in __init__
...(略)...
File "/home/hoge/.pyenv/versions/3.10.11/lib/python3.10/site-packages/numba/core/caching.py", line 337, in __init__
raise RuntimeError("cannot cache function %r: no locator available "
というわけでnumbaのパッケージでエラーになっている様子。
調べるとnumbaの0.48より大きいバージョンではキャッシュディレクトリのパスを環境変数に設定しないとエラーが出る様になった様です。
systemctlコマンドで起動時に環境変数を渡せる様にするため、httpdのserviceファイルの位置を確認。
sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
Active: active (running) since Tue 2023-08-08 11:05:06 UTC; 31min ago
Docs: man:httpd.service(8)
Main PID: 122657 (httpd)
Status: "Total requests: 35; Idle/Busy workers 100/0;Requests/sec: 0.0187; Bytes served/sec: 1.1KB/sec"
Tasks: 242 (limit: 18904)
Memory: 984.5M
CPU: 1min 27.413s
CGroup: /system.slice/httpd.service
├─122657 /usr/sbin/httpd -DFOREGROUND
├─122659 /usr/sbin/httpd -DFOREGROUND
├─122660 /usr/sbin/httpd -DFOREGROUND
├─122662 /usr/sbin/httpd -DFOREGROUND
├─122672 /usr/sbin/httpd -DFOREGROUND
└─122841 /usr/sbin/httpd -DFOREGROUND
ということで/usr/lib/systemd/system/httpd.service
にサービスの起動ファイルがあるので、こちらに環境変数設定行を追加。
...(略)...
[Service]
Type=notify
Environment=LANG=C
Environment=NUMBA_CACHE_DIR=/tmp # ここを追加
以上、これでsystemctl restart httpdで行けました。
rembgもWebアプリケーション上で無事動きました。