pyinstaller 可执行文件失败

pyinstaller executable fails

我需要从我的 Python 3 应用程序创建一个可执行文件。因为我需要在 Linux (Ubuntu) 和 Windows 中执行此操作,所以我决定使用 PyInstaller(它允许创建单个可执行文件,支持多个平台并使用 Python 3).此应用程序使用 GDAL 来翻译和扭曲图像。当我 运行 它与激活的 conda 环境一起工作时它工作得很好。

这是我用 pyi-makespec:

生成的规范文件
# -*- mode: python -*-

block_cipher = None


a = Analysis(['../../src/app.py'],
            pathex=['var/pyinstaller/'],
            binaries=[],
            datas=[],
            hiddenimports=[],
            hookspath=[],
            runtime_hooks=[],
            excludes=[],
            win_no_prefer_redirects=False,
            win_private_assemblies=False,
            cipher=block_cipher,
            noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
            cipher=block_cipher)
exe = EXE(pyz,
        a.scripts,
        a.binaries,
        a.zipfiles,
        a.datas,
        [],
        name='app',
        debug=False,
        bootloader_ignore_signals=False,
        strip=False,
        upx=True,
        runtime_tmpdir=None,
        console=True )

这是它不断抛出的错误:

ERROR 1: PROJ: proj_create_from_database: Open of /home/cisu/anaconda3/envs/env_name/share/proj failed
ERROR 1: Translating source or target SRS failed:
EPSG:5678
ERROR 1: PROJ: proj_create_from_wkt: Open of /home/cisu/anaconda3/envs/env_name/share/proj failed
ERROR 1: PROJ: pj_obj_create: Open of /home/cisu/anaconda3/envs/env_name/share/proj failed
Traceback (most recent call last):
File "src/app.py", line 235, in <module>
File "src/app.py", line 204, in process
File "src/app.py", line 165, in _warp
File "site-packages/osgeo/gdal.py", line 625, in Warp
File "site-packages/osgeo/gdal.py", line 3410, in wrapper_GDALWarpDestName
TypeError: in method 'wrapper_GDALWarpDestName', argument 4 of type 'GDALWarpAppOptions *'
[17879] Failed to execute script app

这是针对 --onedir 配置的,它与 --onefile 配置的行为完全相同。 GDAL 没有安装在我的系统中,但它安装在我用来构建二进制文件的 conda 环境中。有人知道我做错了什么吗?

编辑

我在全新 Ubuntu 安装中启动了二进制文件,这就是我得到的:

ERROR 1: PROJ: proj_create_from_database: Cannot find proj.db
ERROR 1: Translating source or target SRS failed:
EPSG:5678

由于某种原因,错误有所不同,但仍然无法正常工作。

我找到了这个问题的解决方案。我将文件 proj.db 从 anaconda 环境复制到可执行文件所在的目录,然后我向 spec 文件添加了一个运行时挂钩,以将 PROJ_LIB 目录设置为可执行文件的当前位置。这是规范文件中的行:

runtime_hooks=['hook.py']

这是全部 hook.py:

import os
import sys

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

它解决了问题,只要 proj.db 文件存在于可执行文件的位置,应用程序就可以运行。

可能有点晚了,但我希望这对其他人有所帮助。 我遇到了类似的问题并收到了相同的错误消息:

ERROR 1: PROJ: proj_create_from_wkt: Open of /home/user/miniconda/envs/test_env/share/proj failed

,但 Python 2.7。您指定的 conda 频道和 GDAL 版本是什么?也许您可以像我一样解决您的问题,而无需重置环境变量。目前,condaconda-forge 频道安装版本 3.0.0默认。我通过使用旧版本的 GDAL 解决了它:

conda install -c conda-forge gdal=2.4.1