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 版本是什么?也许您可以像我一样解决您的问题,而无需重置环境变量。目前,conda 从 conda-forge 频道安装版本 3.0.0默认。我通过使用旧版本的 GDAL 解决了它:
conda install -c conda-forge gdal=2.4.1
我需要从我的 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 版本是什么?也许您可以像我一样解决您的问题,而无需重置环境变量。目前,conda 从 conda-forge 频道安装版本 3.0.0默认。我通过使用旧版本的 GDAL 解决了它:
conda install -c conda-forge gdal=2.4.1