GeoDjango:无法导入名称 GEOSException 已修复,现在 [WinError 126]

Posted

技术标签:

【中文标题】GeoDjango:无法导入名称 GEOSException 已修复,现在 [WinError 126]【英文标题】:GeoDjango: cannot import name GEOSException fixed, now [WinError 126] 【发布时间】:2015-01-16 01:18:45 【问题描述】:

我正在使用 python 3.4、postgres 9.3.5、Windows 7。

我按照这个来尝试让 GeoDjango 工作: https://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#windows

当我尝试将 django.contrib.gis 添加到已安装的应用程序(在 pycharm 中),或者当我尝试运行时

以下是回溯。

但是,在这个目录中 C:\Python34\Lib\site-packages\django\contrib\gis\geos 有geometry.py(其中包含GEOSGeometry 类)和error.py(其中包含GEOSException 类)。

当我在 python shell 中运行它时,它不会抛出任何错误:

>>> from django.contrib.gis.geos.error import GEOSException 

感谢您对问题可能存在的任何想法。 一堆其他的回溯,然后:

  File "C:\Python34\lib\site-packages\django\contrib\gis\forms\fields.py", line
8, in <module>
    from django.contrib.gis.geos import GEOSException, GEOSGeometry
ImportError: cannot import name 'GEOSException'

更新 我发现了一些建议我应该更新项目设置的信息:

GEOS_LIBRARY_PATH = r'C:\Program Files\OSGeo4W64\bin\geos_c.dll'

这行得通,但现在我收到 WinError 126

  File "C:\Python34\lib\site-packages\django\contrib\gis\forms\fields.py", line
8, in <module>
    from django.contrib.gis.geos import GEOSException, GEOSGeometry
  File "C:\Python34\lib\site-packages\django\contrib\gis\geos\__init__.py", line
 9, in <module>
    from .libgeos import geos_version, geos_version_info  # NOQA: flake8 detects
 only the last __all__
  File "C:\Python34\lib\site-packages\django\contrib\gis\geos\libgeos.py", line
61, in <module>
    lgeos = CDLL(lib_path)
  File "C:\Python34\lib\ctypes\__init__.py", line 351, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 126] The specified module could not be found

我不清楚是什么模块找不到,也不知道如何修复它。

【问题讨论】:

【参考方案1】:

我能够解决问题。看看我在这里做了什么:

Django forum with how I fixed it

抱歉,此错误消息不明确。我已经提交了一张改进票 它:https://code.djangoproject.com/ticket/23873

错误信息的原因是你没有安装 GEOS 位于您的 sys.path 上并且可以导入。 (也就是说,某 在 https://docs.djangoproject.com/en/1.7/ref/contrib/gis/install/#osgeo4w 或以下步骤无法正常工作。)

如果你查看 django/contrib/gis/geos/init.py,你会看到 只有当 HAS_GEOS 为 True 时,才会在此处导入 GEOSException。因此 如果您从 django.contrib.gis.geos 导入 GEOSException 将成功 已安装 GEOS,否则会失败。

至于win 126的错误:

我不确定到底是什么帮助最终修复了它,但是:

    我把我的python版本从64位改成了32位 更新路径变量的脚本非常混乱,所以我手动将它们更改为应有的值。 我错误地添加了GEOS_LIBRARY_PATH

C:\程序文件\OSGeo4W\bin\geos_c.dll

但我应该补充:

C:\OSGeo4W\bin\geos_c.dll

现在,我可以从项目设置中删除 GEOS_LIBRARY_PATH 并且一切仍然有效,所以我想这一定是 64 位与 32 位的问题,或者路径问题。

【讨论】:

以上是关于GeoDjango:无法导入名称 GEOSException 已修复,现在 [WinError 126]的主要内容,如果未能解决你的问题,请参考以下文章

GeoDjango 中新 GeometryField 的通用输入元素

GeoDjango 距离查询返回不正确的结果

带有 Postgis Geodjango 安装的 Postgresql

geodjango 同步数据库错误。来自 geodjango 教程

ImportError:无法导入名称而无法导入类

导入 theano 时出错“无法导入名称 gof”