Получение ошибки при преобразовании python в exe (из-за библиотеки folium)

#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 файла:

  1. foliumfolium.py
  2. foliumraster_layers.py
  3. 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