PyInstaller可执行文件无法运行

3

我需要从我的Python 3应用程序创建可执行文件。因为我需要在Linux(Ubuntu)和Windows上进行操作,所以我决定使用PyInstaller(它允许创建单个可执行文件,支持多个平台并且适用于Python 3)。该应用程序使用GDAL来翻译和变形图像。当我激活conda环境运行时,它就可以正常工作。

这是我用pyi-makespec生成的spec文件:

# -*- 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

由于某种原因,错误信息不同,但仍然无法工作。
2个回答

3

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

runtime_hooks=['hook.py']

这里是完整的 hook.py 文件:

import os
import sys

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

只要在可执行文件的位置存在 proj.db 文件,该应用程序就能解决问题并正常工作。

为解决这个问题,我已经花了10个小时进行故障排除,直到找到了您的解决方案。非常感谢!我相信您也可以指出文件的位置,例如 ...=/home/ubuntu/anaconda3/envs/myEnv/share/proj,而不必将其复制到您的工作目录中。 - Binx

2
也许有点晚了,但我希望这对其他人有所帮助。 我遇到了类似的问题,并收到了相同的错误消息:「Original Answer」。
ERROR 1: PROJ: proj_create_from_wkt: Open of /home/user/miniconda/envs/test_env/share/proj failed

你使用的是Python 2.7,你指定了哪个conda频道以及哪个GDAL版本?也许你可以像我一样解决问题,而不需要重置环境变量。目前,conda默认安装来自conda-forge频道的版本3.0.0。我通过使用较旧的GDAL版本来解决这个问题:


conda install -c conda-forge gdal=2.4.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接