在使用pyinstaller打包含有pyproj的程序时,可能出现错误:ImportError: No module named 'pyproj.datadir'。
这是由于pyproj是基于cython的,而pyinstaller在处理cython写的程序时不能知道pyx文件中有没有引入python模块: “PyInstaller can not determine if the Cython C object module is importing some Python module”。这是需要在setup.spec文件的hiddenimports加入缺少的模块。
查看pyproj源码,在pyproj/pyproj/_datadir.pyx中有:
import os from libc.stdlib cimport malloc, free from pyproj.compat import cstrencode, pystrdecode from pyproj.datadir import get_data_dir from pyproj.exceptions import ProjError, DataDirError
即cython模块_datadir.pyx中引入了python模块。
解决方法:hiddenimports加入pyproj.datadir,即
a = Analysis(['test.py'],
pathex=[],
binaries=[],
hiddenimports=['pyproj.datadir',],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)