解决ERROR 1 PROJ proj create from database Cannot find proj.db
解决ERROR 1 PROJ proj create from database Cannot find proj.db
ytkz针对部分小工具用户反馈:由于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