使用 cx_Freeze、Python3.4 导入 GDAL

Posted

技术标签:

【中文标题】使用 cx_Freeze、Python3.4 导入 GDAL【英文标题】:Importing GDAL with cx_Freeze, Python3.4 【发布时间】:2014-07-28 15:38:34 【问题描述】:

我正在尝试为 Python3.4 中的某些代码创建可执行文件,以分发到 Windows。该程序的某些映射功能需要 GDAL,但它在 cx_Freeze 构建期间出现在 Missing Modules 中:

Missing modules:
? _gdal imported from osgeo, osgeo.gdal
? _gdal_array imported from osgeo.gdal_array
? _gdalconst imported from osgeo.gdalconst
? _ogr imported from osgeo.ogr
? _osr imported from osgeo.osr

cx_Freeze .exe 仍然可以构建,但是当我尝试运行它时,我自然会得到:

ImportError: No module named '_gdal'

下面是我的设置脚本:

import sys  
from cx_Freeze import setup, Executable 

application_title = "Parametric_Price" #what you want to application to be called
main_python_file = "ParamMain.py" #the name of the python file you use to run the program

base = None
if sys.platform == "win32":
    base = "Win32GUI"

includes = ["atexit","re","osgeo.ogr"]
packages = ["osgeo"]
# includeFiles = 

build_exe_options = "packages": packages, "includes": includes

setup(
        name = application_title,
        version = "0.1",
        description = "Parametric pricing tool using historical earthquake, hurricane datasets",
        options = "build_exe" : build_exe_options ,
        executables = [Executable(main_python_file, base = base)])

我尝试了各种方法来手动包含模块,使用包含在 cx_Freeze 设置文件的 build_exe 选项中,但无济于事,并且在 Python3 上确实限制了我对替代可执行分发工具的选择。有谁知道如何解决这个导入问题?

【问题讨论】:

如果您在 Python shell 中执行 import _gdalprint _gdal,您会看到什么? @ThomasK 它导入没有错误,我可以访问它的功能。在程序本身中,我通过 osgeo.ogr、osgeo.osr 间接导入它,它在那里也能正常工作。我相信这个问题是我的 cx_Freeze 设置所特有的。 我明白了。但是print _gdal 应该会告诉你它是从哪里加载的,这可能会为 cx_Freeze 找不到它的原因提供线索。 【参考方案1】:

我也遇到了同样的问题,这似乎是与 SWIG 相关的问题。 我的解决方法是从 Traceback 中获取所有引发异常的“osgeo”文件,并使用以下 sn-p 手动修改代码(例如 C:\Python34\Lib\site-packages\osgeo__init__.py):

 except ImportError:
    import _gdal
    return _gdal

到:

 except ImportError:
    from osgeo import _gdal # MANUAL PATCH: added 'from osgeo'
    return _gdal

希望对你有帮助!

【讨论】:

以上是关于使用 cx_Freeze、Python3.4 导入 GDAL的主要内容,如果未能解决你的问题,请参考以下文章

使用 cx_Freeze 创建一个带有 Python 3.4 的 exe

使用 cx_Freeze 时出现问题:“无法导入名称 'tf2'”

cx_freeze 不导入外部模块

cx_Freeze 和 Python 3.4

使用 cx_Freeze 导入 matplotlib.pyplot 和 BeautifulSoup

cx_Freeze:找不到文件/目录 icon.gif