You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:18:11