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

标签 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 所做的那样,但是由于脚本运行后它失败了,我不认为它指的是他们。

我在下面包含了规范文件。我可以使用一些关于如何获取 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 )

最佳答案

从 GDAL 2.1 开始,您可以在 python 绑定(bind)中使用 gdal_translate 的“librified”版本,这可能更健壮并且可以防止您不得不处理路径:

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 模块一样对待

关于build - Pyinstaller - 从 os.system (gdal_translate) 调用 GDAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32931976/

相关文章:

netbeans - 如何使用 NetBeans 生成的 ant 脚本创建 WAR 文件?

java - 从 Java 运行 "sandbox"内的可执行文件

python - Pyinstaller 缺少引导加载程序

c# - Xamarin iOS,无法打开 Info.plist

java - 为 Play 编写构建脚本!框架应用

go - 当项目具有内部依赖性时,bazel golang 构建失败

java - 将此 Java Swing 应用程序转变为沙盒可嵌入(小程序或 Web Start)的最佳方法是什么?

linux - 为什么一个操作系统 (Windows) 的二进制文件不能在同一底层架构的其他操作系统 (Linux) 中运行?

python - pyqt应用程序需要以管理员权限运行

python - PyInstaller 2.1导入自定义包