PythonでRPAシステムを開発しています。Python環境が構築されていない環境でも動かしたいので、exe化できるPyInstallerでビルドします。その時に起きたエラーをメモします。
トラブル発生
ビルドは以下の方法で行いました。特にエラーもなくビルド成功です。
pyinstaller main.py --onefile
出来上がった main.exe を実行してみると以下のエラーが出て落ちるのです。
ModuleNotFoundError: No module named 'comtypes.stream'
[300] Failed to execute script 'main' due to unhandled exception!
comtypes.stream というモジュールが見つからないよ!と言ってます。ですのでこのモジュールをインストールします。
pip install comtypes
Requirement already satisfied: comtypes in c:\users\papa\appdata\local\anaconda3\lib\site-packages (1.4.5)
あら?「要件はすでに満たされています」とのことです。すでにインストールされています。一体どうすればいいのでしょう…?
解決方法
解決方法は specファイルに必要なモジュールを記述する というものでした。
main.exe と同じ階層に main.spec というファイルが生成されています。そのファイルを修正します。
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=['comtypes.stream'], ←ここ!!
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
「hiddenimports」という項目がありますので、そこに必要なモジュール「comtypes.stream」を記述します。
hiddenimports=['comtypes.stream'],
ビルドコマンドも少し変わります。spec ファイルをビルドします。その前に同じ階層にある「build」フォルダと「dist」フォルダを削除します。
pyinstaller main.spec
これで無事、必要なモジュールが含まれたexeが完成しました!
まとめ
・必要なモジュールを specファイルの「hiddenimports」に記述する。
・spec ファイルを PyInstaller でビルドする。
実はここにたどり着くのに1日かかりました…自分の中で時間のかかる問題というは、意外とあっけない解決策だったりするんですよね。そんなものです。でも無事解決できてよかったです。
コメント