Get PyInstaller to import Basemap

那年仲夏 提交于 2019-12-03 09:54:41

Took me a few days, but I think I sorted it from piecing together a few partial solutions:

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

In pyproj.py, found in C:...\Lib\site-packages\mpl_toolkits\basemap Just past the huge lists is a line that looks something like

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

Replace that with

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

The piece that was missing from the linked solution was then adding the data path when actually running PyInstaller with --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

Just thought I'd post in case anyone else was banging their head on this one.

All you need to do is tell PyInstaller to add the basemap data to the distribution. Here is some sample code. Assuming that you have an ortho.py file in directory E:\scratch, put the following ortho.spec in the same directory and run it as

PyInstaller -y ortho.spec

Here is 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')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!