【问题标题】:GDAL Import Error after freezing Python 3 script冻结 Python 3 脚本后的 GDAL 导入错误
【发布时间】:2014-09-25 09:36:55
【问题描述】:

我正在尝试冻结一个包含从 osgeo 导入的 Python 脚本,但可执行文件失败并显示 ImportError: No module named '_gdal'

我已将我的脚本精简为一行:

import osgeo

在 Python(版本 3.3.3)中运行时一切正常。我试过用 cx_Freeze 和 py2exe 冻结。两者都报告缺少模块:? _gdal imported from osgeo(以及其他)但成功冻结了脚本。然后 exe 因上述 ImportError 而失败。

我尝试在 python 中导入 _gdal 并且它有效。我尝试在冻结选项中手动包含 osgeo 模块,但仍然出现相同的错误。

这里有一个类似的问题: Importing GDAL with cx_Freeze, Python3.4 但也许这不是 cx_freeze 问题,因为它也发生在 py2exe 上(它现在对 python 3 有实验性支持)。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 同样的问题,我问了最后一个有这个问题的人:如果你在 Python 提示符中输入import _gdal 然后print(_gdal),它会显示什么?
  • @ThomasK 导入 _gdal 失败,除非我先导入 osgeo。在我这样做之后,print(_gdal) 打印:<module '_gdal' from 'C:\\Python33\\lib\\site-packages\\osgeo\\_gdal.pyd'>
  • 哦,swig 正在做有趣的事情。尝试进入C:\Python33\lib\site-packages\osgeo\__init__.py 并将第13 行(ish)从import _gdal 编辑为from . import _gdal,然后再次冻结。这是我建议您更改的文件:gist.github.com/takluyver/ac036f733c6f79342780

标签: python py2exe cx-freeze gdal


【解决方案1】:

我找到了解决办法。我编辑了 osgeo\__init__.py 文件并修改了第 13 行,如下所示:import osgeo._gdal。这有效,但前提是模块 osgeo._gdal 在冻结时手动包含。 @Thomas K 你的解决方案和我猜的一样。

请注意,如果需要,必须对 osgeo.ogr(第 18 行)和 osgeo.osr(第 18 行)模块应用相同的修改(分别为 import osgeo._ogrimport osgeo._osr)。这意味着在冻结时也必须手动包含这些内容。我的冻结命令现在看起来像这样:python cxfreeze.py module1.py --include-modules=osgeo._gdal,osgeo._ogr,osgeo._osr

感谢@Thomas K 的帮助。

【讨论】:

猜你喜欢
  • 2020-05-16
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多