尊敬的学习者们,您好。我在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文件做的那样,但由于脚本运行后失败,我认为它没有引用它们。
下面是我的spec文件。我需要一些建议,如何让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 )
gdal
文件包含在我执行pyinstaller的文件夹中,所以可能是这个原因导致它在构建过程中没有崩溃。但没有IOError:消息。脚本运行直到它遇到os.system
调用。编译后的文件夹中没有任何文件,只有可执行文件。我应该使用标志来激活pyinstaller吗?我认为问题可能取决于系统路径变量?虽然如果gdal
文件已经包含在编译中,你会认为它会找到它们。 - Praxischdir(sys._MEIPASS)
添加到我的脚本中,将运行时路径定向到正确的目标位置,即 exe 被解压和运行的位置。然后就能找到 GDAL 插件了。当然,在 spec 文件中添加了a.binaries +=['gdal_translate.exe', 'gdal_translate.exe', 'DATA']
。 - Praxis