pyinstaller可执行文件失败

时间:2019-06-06 07:39:27

标签: python-3.x pyinstaller gdal

我需要从我的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

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

2 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法。我将文件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文件存在,应用程序就可以正常工作。

答案 1 :(得分:0)

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

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
相关问题