PyInstaller はPythonで制作したプログラムをパッケージ化し、WindwosやMac OS上で実行可能なアプリを生成するモジュールです。PyInstallerを使えば、ユーザーがPythonをインストールしなくても、Pythonで書いたアプリを実行できるようになります。
バージョン4.5になって使い勝手がよくなりましたが、importしたモジュールの扱いに関してはまだまだ不可解な挙動をすることがあります。
今回はPyInstallerで "No module named…" エラーが発生したときの対処法についてまとめています。
結論
PyInstallerでアプリをビルドするとき、またはアプリの実行中に "No module named…"エラーが発生したときの対処一覧。
- 仮想環境は適切に選択されているか? pyinstallerと使用しているモジュールがインストールされた適切な環境で実行しているか?確認する。
- specファイルのhidden_importに追加してみる。
- 上記でも解消しなければ、pyinstaller、および問題となっているモジュールを再インストールする。
以下のドキュメントを一通りチェックすれば大体解決できるはずです。今回の記事でもこれを参照しています。
When Things Go Wrong — PyInstaller 4.5.1 documentation
Pythonのスキルを使って毎月の収入源を増やすのが最適なんじゃないかという件
実際、今のスキルに合わせて仕事を獲得し、スキマ時間で毎月+5、+20、+70万円くらいの人が多いです。
必要なスキル、仕事の獲得までの流れは以下の記事で徹底解説しています。
(もちろん全部無料です)
空いた時間にぜひ参考にしてみてください。
実行環境
Windows 10 Pro (x64) 20H2
Python 3.9.4
pyinstaller 4.5
1. 仮想環境が適切に選択されているのを確認
venv, condaなどの仮想環境を使用しているときは、PyInstallerと適切なモジュールがインストールされている環境がアクティブになっているか確認する。
アクティブな仮想環境でインストールされているパッケージを一覧表示するには次のようにします。
$ pip freeze
# ~~~
# pyinstaller==4.5
# ~~~
環境を入れ替えてから、ビルドに成功すれば問題ありません。
2. specファイルのhidden_importに追加する
PyInstallerのビルドでは、原則的にコードでimportしているモジュールを自動で解析します。
しかし自動でモジュールが認識されずにNo module named…エラーが発生することも。
そんなときはHidden Importsを追加して解消します。
Hidden Imports を追加するには主に
- オプションを指定する方法
- specファイルに追記する方法
があります。
--hidden-importオプションを指定する
$ pyinstaller xxxx.py –hidden-import=[モジュールへのパス]
エラーが出なくなるまで、必要なモジュールだけを追加していきます。
specファイルに追記する
以下はspecファイルのサンプル例です。
block_cipher = None
a = Analysis(['minimal.py'],
pathex=['/Developer/PItests/minimal'],
binaries=None,
datas=None,
hiddenimports=[モジュールへのパス],
hookspath=None,
runtime_hooks=None,
excludes=None,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,... )
coll = COLLECT(...)
specファイルを利用してビルドするには、次のようなコマンドを実行します。
$ pyinstaller app.spec
3. (それでもダメなら)モジュール自体を再インストール
上記の対応をしても、なおエラーが出てしまう場合は、PyInstallerと対象のモジュールを再インストールします。
設定は一通り正しそうだけどうまく動かない…そんなときはコレで解消できる場合が多いです。
pip なら以下のように、pip uninstall 、pip install でOKです。
$ pip uninstall sqlalchemy
$ pip install sqlalchemy