Pyinstaller - 从os.system调用GDAL(gdal_translate)

时间:2015-10-04 09:28:22

标签: build executable pyinstaller gdal os.system

问候学者们。在Windows 7上运行32位Python2.7。

我有一个关于在pyinstaller构建中包含GDAL可执行文件的问题。我正在进行系统调用以从FWTools版本运行两个GDAL函数。这些函数位于Windows C:\Program Files (x86)\FWTools2.4.7\bin上的PATH变量中,因此它可以在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脚本中从系统运行的可执行文件。

规格:

# -*- 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 )

1 个答案:

答案 0 :(得分:0)

从GDAL 2.1您可以使用' librified' python绑定中的gdal_translate版本,它可能更强大,并且可以防止您不得不使用路径:

import gdal
gdal.Translate(<options>)

可以在gdal存储库的测试套件中找到它的一些使用示例: https://svn.osgeo.org/gdal/trunk/autotest/utilities/test_gdal_translate_lib.py

你可以pip install gdal,我相信它是2.1版本(在Linux上)。对于Windows,最简单的安装方式是使用conda

这可以防止你不得不在pyinstaller中包含二进制文件/路径,因为它可以被视为任何python模块