Получить PyInstaller для импорта базовой карты

Я работаю над созданием автономного исполняемого файла для простого инструмента, который я создал, который использует Basemap. (Используя Python 2.7, используя версию PyInstaller для разработчиков — 2.1). .exe (один файл) строится нормально, но когда он запускается, я получаю следующую ошибку:

Traceback <most recent call last>:
  File "<string>", line 9, in <module>
  File "c:\python27\lib\site-packages\PyInstaller-2.1dev_-py2.7.egg\PyInstaller\loader\pyi_importers.py", line 270, in load_module
    exec<bytecode, module.__dict>
  File "C:\Documents and Settings\MYNAME\Python code\Flood\src\root\nested\build\FloodRisk\out00-PYZ.pyz\mpl_toolkits.basemap", line 30, in <module>
  File "c:\python27\lib\site-packages\PyInstaller-2.1dev_-py2.7.egg\PyInstaller\loader\pyi_importers.py", in load_module
    exec<bytecode, module.__dict__>
  File "C:\Documents and Settings\MYNAME\My Documents\Python code\Flood\src\root\nested\build\FloodRisk\out00-PYZ.pyz\mpl_toolkits.basemap.pyproj", line 242, in <module>
IOError: proj data directory not found. Expecting it at: C:\DOCUME~1\MYNAME\LOCALS~1\Temp\_MEI68362\mpl_toolkits\basemap\data

Кому-нибудь удалось правильно загрузить Basemap в один файл .exe, созданный с помощью PyInstaller? Я строю, используя очень простой пакетный файл:

C:\Python27\python.exe "C:\Python27\Lib\site-packages\pyinstaller-develop\PyInstaller\main.py" --onefile "C:\Documents and Settings\MYNAME\My Documents\Python code\Flood\src\root\nested\FloodRisk.py"
pause

Спасибо!


person khe    schedule 19.07.2013    source источник


Ответы (2)


Мне потребовалось несколько дней, но я думаю, что разобрался, собрав воедино несколько частичных решений:

Из http://www.jontrinder.com/blog/?paged=2:

В pyproj.py, найденном в C:...\Lib\site-packages\mpl_toolkits\basemap Сразу за огромными списками находится строка, которая выглядит примерно так

pyproj_datadir = os.sep.join([os.path.dirname(__file__), 'data'])

Замените это на

if 'PROJ_DIR' in os.environ:
    pyproj_datadir = os.environ['PROJ_DIR']
else:
    pyproj_datadir = os.sep.join([os.path.dirname(__file__), 'data'])

Часть, которая отсутствовала в связанном решении, заключалась в добавлении пути к данным при фактическом запуске PyInstaller с --paths

C:\Python27\python.exe "C:\Python27\Lib\site-packages\pyinstaller-develop\PyInstaller\main.py" --onefile --paths="C:\Python27\Lib\site-packages\mpl_toolkits\*" "C:\Documents and Settings\KAHERE\My Documents\Python code\Flood\src\root\nested\FloodRisk.py"
pause

Просто подумал, что я опубликую на случай, если кто-то еще ударится головой об этом.

person khe    schedule 23.07.2013
comment
Для дальнейшего использования: размещенная вами ссылка ведет на главную страницу блога. Я думаю, что конкретное сообщение, на которое вы ссылались, это: Pyinstaller, Matplotlib и Базовая карта - person ToddEmon; 01.08.2019

Все, что вам нужно сделать, это указать PyInstaller добавить данные базовой карты в дистрибутив. Вот пример кода. Предполагая, что у вас есть файл ortho.py в каталоге E:\scratch, поместите следующий файл ortho.spec в тот же каталог и запустите его как

PyInstaller -y ortho.spec

Вот орто.спек:

a = Analysis(['ortho.py'],
             pathex=['E:\\scratch'],
             hiddenimports=[],
             hookspath=None,
             runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='ortho.exe',
          debug=False,
          strip=None,
          upx=True,
          console=True )

import mpl_toolkits.basemap
import os

src_basedata = os.path.join(mpl_toolkits.basemap.__path__[0], "data")
tgt_basedata = os.path.join('mpl_toolkits', 'basemap', 'data')

coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas + Tree(src_basedata, prefix=tgt_basedata),
               strip=None,
               upx=True,
               name='ortho')
person Nimar    schedule 27.06.2014