pyinstaller executable fails

Viewed 2226

I need to create an executable file from my Python 3 application. Because I need to do it in Linux (Ubuntu) and Windows, I decided to use PyInstaller (it allows to create a single executable file, supports multiple platforms and works with Python 3). This application uses GDAL to translate and warp images. When I run it with activated conda environment it works just fine.

Here is my spec file I generated with 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 )

And here is the error it keeps throwing:

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

This is for --onedir configuration and it behaves exactly the same for the --onefile configuration. GDAL is not installed in my system, but it is installed in the conda environment I use to build the binary file. Does anyone have an idea on what am I doing wrong?

EDIT

I started the binary file in the fresh Ubuntu installation and that's what I've got:

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

For some reason the error is different, but it's still not working.

2 Answers

I found the solution to this issue. I copied the file proj.db from anaconda environment to the directory where the executable file is and then I added a runtime hook to the spec file to set the PROJ_LIB directory to the current location of the executable file. This is the line from the spec file:

runtime_hooks=['hook.py']

and here is the whole hook.py:

import os
import sys

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

It solves the problem and the application is working as long as the proj.db file exists at the location of the executable file.

Maybe a bit late, but I hope this could be of help for someone else. I had a similar issue and got the same error message:

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

, but with Python 2.7. What conda channel and what GDAL version did you specify? Maybe you can solve your issue similar as I did, without resetting the environmental variable. At the moment, conda installs the version 3.0.0 from the conda-forge channel by default. I solved it by using an older version of GDAL:

conda install -c conda-forge gdal=2.4.1
Related