使用PyInstaller打包后出现proj.db找不到的问题求助
解决PyInstaller打包GDAL/pyproj后找不到proj.db的问题
我之前也碰到过完全一样的坑,核心问题在于PyInstaller默认不会自动打包proj.db这类依赖数据文件,而且打包后脚本的运行路径和开发环境完全不同,导致你手动设置的固定路径失效。结合你的环境(Windows 10、Python 3.5、pyproj 2.4.2、GDAL 3.0.4),可以试试下面这些针对性的解决方法:
1. 打包时强制包含proj.db文件
首先找到你环境里proj.db的真实位置:
- 如果用了虚拟环境,路径大概是
venv/Lib/site-packages/pyproj/proj_dir/share/proj/proj.db - 或者你系统里QGIS的路径
C:\Program Files\QGIS 3.4\share\proj\proj.db
然后通过PyInstaller的配置把这个文件打包进去:
方法一:修改.spec文件
先生成.spec文件(运行pyinstaller your_script.py会自动生成),然后在文件的datas列表中添加:datas=[('C:\\Program Files\\QGIS 3.4\\share\\proj\\proj.db', 'proj')],这里第二个参数
proj是打包后存放proj.db的子目录名称。方法二:命令行直接指定
打包时用--add-data参数(Windows系统用分号分隔路径,Linux/mac用冒号):pyinstaller --add-data "C:\Program Files\QGIS 3.4\share\proj\proj.db;proj" your_script.py
2. 在脚本开头动态设置PROJ_LIB路径
关键提醒:必须在导入GDAL或pyproj之前设置环境变量,而且要适配打包后的运行环境:
import os import sys # 判断当前是否是PyInstaller打包后的可执行文件环境 if getattr(sys, 'frozen', False): # sys._MEIPASS是PyInstaller临时解压资源的目录,对应我们打包时指定的proj子目录 proj_lib_path = os.path.join(sys._MEIPASS, 'proj') else: # 开发环境下的路径,保持你原来的设置即可 proj_lib_path = r'C:\Program Files\QGIS 3.4\share\proj' # 设置环境变量 os.environ['PROJ_LIB'] = proj_lib_path os.environ['GDAL_DATA'] = r'C:\Program Files\QGIS 3.4\share\gdal' # 现在再导入GDAL/pyproj from osgeo import gdal # 你的其他业务代码...
这样不管是在PyCharm里测试,还是运行打包后的可执行文件,都能正确定位到proj.db。
3. 排查版本兼容性与路径自动获取
有时候版本不匹配也会导致路径识别异常,你可以在开发环境中运行下面的代码,确认pyproj默认的proj路径:
from pyproj import datadir print(datadir.get_data_dir())
把输出的路径作为开发环境的proj_lib_path,打包时也用这个路径下的proj.db,能减少版本不兼容带来的问题。
4. 其他注意事项
- 优先用
--onedir模式打包(默认就是这个模式),比--onefile更容易排查文件是否被正确包含,打包后可以直接在输出目录里检查proj子目录是否存在proj.db。 - 不要同时设置多个
PROJ_LIB环境变量,会导致冲突,保持只有一个正确的路径设置即可。
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

