#python #python-3.x #pyinstaller
#python #python-3.x #pyinstaller
Вопрос:
Вот мой код на Python, который просто генерирует карту в HTML-файл с помощью модуля Folium. Как и ожидалось, код не возвращает никакой ошибки.
import folium
m = folium.Map(location=[39.3999, 8.2245], tiles='cartodbpositron', zoom_start=3)
m.save('output.html')
Однако, когда я конвертирую код python в файл .exe, я получаю следующую ошибку, когда хочу выполнить файл .exe:
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "/home/nade/.local/lib/python3.8/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
exec(bytecode, module.__dict__)
File "folium/__init__.py", line 5, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "/home/nade/.local/lib/python3.8/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
exec(bytecode, module.__dict__)
File "branca/__init__.py", line 1, in <module>
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "/home/nade/.local/lib/python3.8/site-packages/PyInstaller/loader/pyimod03_importers.py", line 493, in exec_module
exec(bytecode, module.__dict__)
File "branca/colormap.py", line 20, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/_MEIS1K8Tv/branca/_cnames.json'
[17356] Failed to execute script test
Я использовал Pyinstaller для преобразования python в .exe, вот команда, которую я использовал (я использовал auto-py-to-exe для более конкретного преобразования):
pyinstaller --noconfirm --onefile --windowed --icon "/path/to/icon" --key "encryption-key-value" "/path/to/script"
Я понял, что это происходит только из-за библиотеки Folium. Как мне сделать этот модуль совместимым при преобразовании в .exe?
Ответ №1:
Я провел некоторое исследование и нашел обходной путь для этой проблемы. Решение, основанное на этом сайте: https://www.tutorialfor.com/questions-153381.htm
Сначала вам нужно изменить эти 3 файла:
- foliumfolium.py
- foliumraster_layers.py
- brancaelement.py
Измените строку ENV = Environment(loader=PackageLoader('folium', 'templates'))
на ниже обоих 3 файлов.
#ENV = Environment(loader=PackageLoader('folium', 'templates'))
import os, sys
from jinja2 import FileSystemLoader
if getattr(sys, 'frozen', False):
# we are running in a bundle
templatedir = sys._MEIPASS
else:
# we are running in a normal Python environment
templatedir = os.path.dirname(os.path.abspath(__file__))
ENV = Environment(loader=FileSystemLoader(templatedir '\templates'))
После этого вам нужно отредактировать .spec
файл. Откройте файл спецификации и добавьте datas
раздел в нижеприведенные строки.
...
binaries=[],
datas=[
(".\env\Lib\site-packages\branca", "branca"),
(".\env\Lib\site-packages\branca\*.json","branca"),
(".\env\Lib\site-packages\branca\templates", "templates"),
(".\env\Lib\site-packages\folium\templates", "templates"),
],
hiddenimports=[],
...
Затем создайте с использованием файла спецификации.
pyinstaller <script_name>.spec