问候学识渊博的同学们。在 Windows 7 上运行 32 位 Python2.7。
我有一个关于在 pyinstaller 构建中包含 GDAL 可执行文件的问题。我正在进行系统调用来运行 FWTools 版本中的两个 GDAL 函数。这些函数位于 Windows 的 PATH 变量中C:\Program Files (x86)\FWTools2.4.7\bin
因此它在 Python27 环境中运行良好。但是,此路径不会延续到 pyinstaller 构建中。
有问题的代码调用 GDAL 函数将图像重新转换到不同的地理空间坐标。
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")
运行时运行良好,直到遇到上述几行,然后返回以下错误:
'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.
我尝试将 gdal_translate.exe 和 gdalinfo.exe 作为二进制文件包含在构建文件夹中,就像您对 .dll 所做的那样,但由于脚本运行后失败,我认为它没有引用给他们。
我已经包含了下面的规范文件。我可以使用一些关于如何让 pyinstaller 构建识别在 python 脚本中从系统运行的可执行文件的建议。
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 )