【PyInstaller】ValueError: cannot load imports from non-existent stub の解決策
このエラーは、PyInstallerが特定のモジュール(多くの場合、科学技術計算ライブラリ)の依存関係を正しく解決できない時に発生します。以下の手順で問題を解決できる可能性が高いです。
1. カスタムフックの作成
問題のモジュールに対する専用のカスタムフックを作成します。
プロジェクトのルートに extra-hooks フォルダを作成します。
extra-hooks フォルダ内に hook-problematic_module.py ファイルを作成します。例:hook-skimage.metrics.py
以下の内容をフックファイルに記述します。
# カスタムフックの例
from PyInstaller.utils.hooks import collect_submodules, collect_data_files
hiddenimports = collect_submodules('problematic_module')
datas = collect_data_files('problematic_module')
2. .spec ファイルの修正
PyInstallerの .spec ファイルを以下のように修正します。
a = Analysis(
['your_script.py'],
pathex=['path/to/your/script'],
binaries=[],
datas=[],
hiddenimports=['problematic_module', 'problematic_module.*'], # ここに問題のモジュールとそのサブモジュールを追加
hookspath=['extra-hooks'], # カスタムフックのパスを指定
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
# .specファイルの残りの部分は変更しない
3. 明示的なインポート
メインスクリプト(your_script.py)の先頭に、問題のモジュールを明示的にインポートします。
# メインスクリプトでのインポート例
import problematic_module
import problematic_module.submodule
4. 依存ライブラリの更新
関連するライブラリを最新版にアップデートします。
# ライブラリのアップグレード例
pip install --upgrade problematic_library
例えば、scikit-imageに関連するエラーの場合
pip install --upgrade scikit-image scipy numpy
5. 仮想環境の使用
クリーンな環境で依存関係を管理するために、仮想環境を作成し、そこで作業することをおすすめします。
# 仮想環境での必要なライブラリのインストール例
python -m venv your_env
your_env\Scripts\activate # Windowsの場合
source your_env/bin/activate # Mac/Linuxの場合
pip install required_libraries
pip install pyinstaller
6. PyInstallerの再実行
上記の変更を適用した後、以下のコマンドでexeファイルを再作成します。
pyinstaller --clean your_script.spec
7. デバッグモードの使用
問題が解決しない場合、PyInstallerのデバッグモードを使用して詳細な情報を得ることができます。
pyinstaller --clean --debug all your_script.spec
これにより、より詳細なエラー情報が得られ、問題の特定に役立つ可能性があります。
注意点
エラーメッセージに含まれるモジュール名や具体的なパスは、あなたの環境やプロジェクトによって異なる場合があります。適宜、適切なモジュール名やパスに置き換えてください。
この問題は特に科学技術計算ライブラリ(scikit-image, scipy, numpy等)を使用する際によく発生します。
上記の手順を順番に試すことで、多くの場合問題を解決できますが、それでも解決しない場合は、使用しているライブラリの公式ドキュメントやコミュニティフォーラムを確認することをおすすめします。
これらの手順を慎重に実行することで、「ValueError: cannot load imports from non-existent stub」エラーを解決できる可能性が高いです。
おまけ:同様の方法で解決可能なエラーメッセージの例
以下のエラーメッセージも、上記の解決策を適用することで解決できる可能性があります。
ModuleNotFoundError: No module named 'sklearn'
scikit-learnライブラリが正しくパッケージ化されていない場合に発生します。
ImportError: cannot import name 'imread' from 'scipy.misc'
scipyの特定の関数やサブモジュールが見つからない場合に発生します。
AttributeError: module 'numpy' has no attribute 'float'
numpyの特定の属性やメソッドが見つからない場合に発生します。
ImportError: DLL load failed: The specified module could not be found.
必要なDLLファイルが見つからない場合に発生します(特にWindows環境で)。
OSError: [WinError 126] The specified module could not be found
上記のDLLエラーと類似しており、モジュールやライブラリが見つからない場合に発生します。
RuntimeError: module compiled against API version 0xb but this version of numpy is 0xa
ライブラリのバージョンの不一致によって発生します。
ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject
numpyやその依存ライブラリのバージョンの不一致によって発生します。
ImportError: cannot import name 'PILLOW_VERSION' from 'PIL'
Pillowライブラリのバージョンの問題や、正しくパッケージ化されていない場合に発生します。
AttributeError: module 'cv2' has no attribute 'imread'
OpenCV(cv2)の特定の関数が見つからない場合に発生します。
これらのエラーは、依存関係の問題、ライブラリのバージョンの不一致、またはPyInstallerが特定のモジュールや関数を正しくパッケージ化できていないことが原因で発生します。上記の解決策を適用することで、これらの問題も解決できる可能性が高いです。
この記事が気に入ったらサポートをしてみませんか?