実行環境
python 3.10.9
foliumで生成したOSMの地図をwxpythonのGUIで表示するというプログラムを作成しましたが、pyinstallerを使用してexe化した際に地図がGUI上に表示されないという問題にハマったので備忘録的に記載します。
wx.html2.WebViewがexe化したときに正常に動作していないようでした
直接使用するライブラリ
まず、pyinstallerでexe化する際にライブラリで必要なものをpipでインストールします。
pip install folium wxpython pyinstaller
依存関係のあるライブラリ
foliumを含むPythonスクリプトをexe化するために必要なライブラリは、pyinstallerが必要とするライブラリの他に、pywin32やsetuptoolsなど、Windows環境で必要なライブラリが必要になります。
したがって、foliumを含むPythonスクリプトをexe化するために必要なライブラリは、以下のものになります。
pip install pywin32 setuptools
これらのライブラリを含めて、Pythonスクリプトをexe化することで、foliumを含むPythonスクリプトを実行可能ファイルとして作成することができます。
pipでインストールしたバージョン
folium 0.14.0
wxPython 4.2.0
exe化実行
1 Pythonスクリプトを作成する。
foliumを使用したPythonスクリプトを作成します。
wx.html2.WebViewでSetPageを使ってhtmlページを表示する
2 pyinstallerを使用して、Pythonスクリプトを実行可能ファイルに変換する。
pyinstallerを使用してfoliumを含むPythonスクリプトを実行可能ファイルに変換する場合、foliumが依存するライブラリに加えて、pyinstallerが必要とするライブラリを含める必要があります。
pyinstaller your_script.py --hidden-import jinja2 --hidden-import markupsafe --hidden-import branca --hidden-import requests --hidden-import urllib3 --hidden-import chardet --hidden-import certifi --hidden-import flask --hidden-import werkzeug
上記のコマンドでは、foliumを含むPythonスクリプトをyour_script.pyに置き換えてください。また、foliumが依存するライブラリの他に、pyinstallerが必要とするライブラリも--hidden-importオプションを使用して指定しています。
3 pyinstallerのdatasパラメータを使用して、バイナリやJavaScriptファイルを実行可能ファイルに含める
変換が完了したら、2のコマンドで生成されたyour_script.specファイルを編集して、foliumが依存するJavaScriptファイル(例えばLeafletやjQuery)やwxpythonで必要なバイナリを含める必要があります。
ここで、wxPython(4.2.0)ではWebView2Loader.dllをAdd Binaryとして指定する必要があります。
参考 :https://github.com/wxWidgets/Phoenix/issues/2234
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['your_script.py'],
pathex=[],
binaries=[('.venv\\Lib\\site-packages\\wx\\WebView2Loader.dll', '.')],
datas=[('.\\\\.venv\\\\Lib\\\\site-packages\\\\branca\\\\*.json', 'branca')],
hiddenimports=['jinja2', 'markupsafe', 'branca', 'requests', 'urllib3', 'chardet', 'certifi', 'flask', 'werkzeug'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='your_app',
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,
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='your_script',
)
4 pyinstallerを再度実行してexe化
pyinstaller your_script.spec
上記のような手順で作成したexeファイルで、foliumで作成したhtml地図をwxpythonのGUI上に表示することができました。
(参考URL先では過去のwxpythonのバージョンではバイナリ追加手順は必要なかったようなので、過去のバージョンにするのも手かと、、、)