Есть вероятность, что это все еще проблема, и люди из Pyinstaller и / или Folium не заинтересованы в ее исправлении, но я опубликую это здесь, если кто-то там обнаружит обходной путь.
У меня есть программа, которая создает карты, геокоды и т. Д., И недавно я добавил пакет folium для создания некоторых интерактивных карт в формате html.Я всегда компилирую свой код, используя pyinstaller, чтобы другие сотрудники моей компании могли просто использовать исполняемый файл, а не запускать код на python.Если я запускаю свой код в IDE, он загружается, работает и работает точно так, как ожидалось.Однако, когда я пытаюсь скомпилировать, когда у меня есть import folium
где-то в моем скрипте, я получаю ошибку при попытке запустить исполняемый файл, который создает pyinstaller.
Текст ошибки читается примерно так:
Traceback (most recent call last):
File "analysisSuite.py", line 58, in <module>
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "c:\users\natha\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\folium\__init__.py", line 8, in <module>
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "c:\users\natha\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\branca\__init__.py", line 5, in <module>
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "c:\users\natha\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
exec(bytecode, module.__dict__)
File "site-packages\branca\colormap.py", line 29, in <module>
File "site-packages\pkg_resources\__init__.py", line 1143, in resource_stream
File "site-packages\pkg_resources\__init__.py", line 1390, in get_resource_stream
File "site-packages\pkg_resources\__init__.py", line 1393, in get_resource_string
File "site-packages\pkg_resources\__init__.py", line 1469, in _get
File "c:\users\natha\appdata\local\programs\python\python36-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 479, in get_data
with open(path, 'rb') as fp:
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\natha\\AppData\\Local\\Temp\\_MEI309082\\branca\\_cnames.json'
[30956] Failed to execute script analysisSuite
Я все еще относительно новичок в Python, поэтому попытка расшифровать суть этого текста довольно ошеломляющая.Я понятия не имею, есть ли обходной путь, когда мне просто нужно отредактировать файл, добавить файл или добавить какой-либо параметр в pyinstaller, но, возможно, кто-то еще может прочитать это и иметь представление о том, что может быть причиной этой проблемы.Заранее спасибо всем, у кого есть предложения.
РЕДАКТИРОВАТЬ: Проблема, кажется, с branca, который является зависимостью от фолия.Он ищет тот файл _cnames.json, который находится в папке site-packages \ branca, но либо не копируется должным образом, либо, возможно, мне нужно как-то определить в моем скрипте, где он должен искать эти файлы, а затем просто скопировать вручнуюих в папку, которую я выбрал.
ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ: Я тестировал и тестировал и определил суть проблемы.Когда вы запускаете свой exe, он распаковывается во временную папку.Один из модулей в branca
- это colormap.py
. В файле colormap
, по сути, есть три строки, которые мешают правильной загрузке branca
.
resource_package = __name__
resource_path_schemes = '/_schemes.json'
resource_path_cnames = '/_cnames.json'
Итак, когда исполняемый файл распаковывается в эту временную папку, и branca пытается загрузить его из-за этих строк, он ожидает, что эти два файла также будут находиться в этой временной папке, но, конечно,их не будет, потому что им всегда говорят, и они будут находиться только в папке, в которой находится модуль colormap.Ключевым моментом здесь является выяснение способа, чтобы ссылка на путь могла быть относительной, чтобы она не смотрела во временную папку, а также чтобы ссылка была динамической, чтобы везде, где у вас есть исполняемый файл, до тех пор, пока у вас есть эти.json файлы присутствуют в какой-то папке, о которой он «знает», тогда вы будете в порядке.Теперь мне просто нужно выяснить, как это сделать.