解决ERROR 1 PROJ proj create from database Cannot find proj.db

针对部分小工具用户反馈:由于Cannot find proj.db,导致小工具闪退。

这个问题困扰了我许久,debug的第一步是复现bug,而我的电脑不存在这个bug。

造成这个闪退问题的根本原因是,打包后的EXE文件找不到proj.db的位置。

也就是说在你的电脑的环境变量里没有这个proj.db的文件。

经过几番测试,我选择最保险的一个方法,即外挂proj.db,通过将proj的包放在exe文件的同级目录下的方式,进行补救。在运行exe时,自动把当前的路径设置为环境变量。

打包操作

首先在主程序的同文件夹下,新建一个hook.py文件:

import os
import sys
os.environ['PROJ_LIB'] = os.path.dirname(sys.argv[0])

然后运行以下语句:

pyinstaller -F AerialCorrection.py

运行完成后,会生成一个AerialCorrection.spec文件。

修改AerialCorrection.spec文件,把hook.py添加到runtime_hooks。如下:

# -*- mode: python ; coding: utf-8 -*-


a = Analysis(
    ['AerialCorrection.py'],
    pathex=[],
    binaries=[],
    datas=[(r'‪F:\rj\python\Lib\site-packages\pyproj\proj_dir\share\proj\proj.db','.')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=['hook.py'],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='AerialCorrection',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon=[],
)

最后使用pyinstaller打包,语句如下:

pyinstaller AerialCorrection.py