Greetings learned fellows. Running 32bit Python2.7 on Windows 7.
I'm have a question regarding including GDAL executables in a pyinstaller build. I am making a system call to run two GDAL functions from the FWTools release. These functions are in the PATH variable on windows C:\Program Files (x86)\FWTools2.4.7\bin
and so it runs fine from the Python27 environment. However, this path is not carried over to the pyinstaller build.
The code in question is calling a GDAL function to re-translate an image onto different geospatial co-ordinates.
os.system("gdal_translate -of GTiff -a_ullr 694440.7939 6403967.2406 696438.7261 6404791.6774 -a_srs EPSG:28355 site.tif siteGR.tif")
os.system("gdalinfo siteGR.tif")
The runtime works well until it hits the above lines and then returns the following error:
'gdal_translate' is not recognized as an internal or external command,
operable program or batch file.
'gdalinfo' is not recognized as an internal or external command,
operable program or batch file.
I have tried to include both gdal_translate.exe and gdalinfo.exe in the build folder as binaries, much like you would do for a .dll, but since it is failing after the script has got going, I don't think it is referring to them.
I have included the spec file below. I could use some advice on how to get the pyinstaller build to recognize executables run from the system in a python script.
Spec:
# -*- mode: python -*-
a = Analysis(['gis_helper.py'],
pathex=['C:\\Users\\Hp\\PycharmProjects\\GISdev'],
hiddenimports=['scipy.linalg.cython_blas', 'scipy.linalg.cython_lapack', 'scipy.special._ufuncs_cxx', 'ctypes.util', 'pandas.util', 'distutils.util', 'shapely', '_socket', '_proj', 'multiprocessing', '_multiprocessing', 'multiprocessing.process', 'multiprocessing.util'],
hookspath=['C:\\Python27\\Lib\\site-packages\\PyInstaller\\hooks'],
runtime_hooks=None)
a.binaries1=['geos_c.dll', 'geos_c.dll', 'BINARY'],
a.binaries2=['python27.dll', 'python27.dll', 'BINARY'],
a.binaries3=['_socket.pyd', '_socket.pyd', 'BINARY'],
a.binaries4=['win32api.pyd', 'win32api.pyd', 'BINARY'],
a.binaries5=['pywintypes27.dll', 'pywintypes27.dll', 'BINARY'],
a.binaries6=['pythoncom27.dll', 'pythoncom27.dll', 'BINARY'],
a.binaries7=['_imaging.pyd', '_imaging.pyd', 'BINARY'],
a.binaries8=['_fblas.pyd', '_fblas.pyd', 'BINARY'],
a.binaries9=['gdal_translate.exe', 'gdal_translate.exe', 'BINARY'],
a.binaries10=['gdalinfo.exe', 'gdalinfo.exe', 'BINARY'],
import mpl_toolkits.basemap
import os
src_basedata = os.path.join(mpl_toolkits.basemap.__path__[0], "data")
tgt_basedata = os.path.join('mpl_toolkits', 'basemap', 'data')
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
[('v',None,'OPTION')],
a.binaries, # This needs to be included
a.binaries1,
a.binaries2,
a.binaries3,
a.binaries4,
a.binaries5,
a.binaries6,
a.binaries7,
a.binaries8,
a.binaries9,
a.binaries10,
a.zipfiles,
a.datas + Tree(src_basedata, prefix=tgt_basedata),
name='gis_helper.exe',
debug=True,
strip=None,
upx=True,
console=True )
From GDAL 2.1 you can use the 'librified' version of gdal_translate
in the python bindings, which may be more robust and prevent you from having to muck about with the path:
import gdal
gdal.Translate(<options>)
Some examples of it being used can be found in the test suite of the gdal repository: https://svn.osgeo.org/gdal/trunk/autotest/utilities/test_gdal_translate_lib.py
You can pip install gdal
and I believe it is the 2.1 release (on linux). For windows, the easiest way to install is with conda
.
This should prevent you from having to mess around including binaries/paths in pyinstaller too much as it can be treated like any python module
来源:https://stackoverflow.com/questions/32931976/pyinstaller-calling-gdal-from-os-system-gdal-translate