2010-10-04 58 views
4

我正在构建我的第一个GeoDjango项目,但我有点绝望。libgeos_c-1.dll无法由Python加载

我在Windows上通过一键式安装程序安装了PostgreSQL 9和PostGis 1.5。所以在那里。我在settings.py中将GEOS_LIBRARY_PATH设置为libgeos_c-1.dll的完整路径。但是当我运行manage.py syncdb时,遇到以下错误:

File "C:\Python25\lib\site-packages\django\contrib\gis\geometry\backend\geos.py", line 1, in <module> 
    from django.contrib.gis.geos import \ 
    File "C:\Python25\Lib\site-packages\django\contrib\gis\geos\__init__.py", line 6, in <module> 
    from django.contrib.gis.geos.geometry import GEOSGeometry, wkt_regex, hex_regex 
    File "C:\Python25\Lib\site-packages\django\contrib\gis\geos\geometry.py", line 14, in <module> 
    from django.contrib.gis.geos.coordseq import GEOSCoordSeq 
    File "C:\Python25\Lib\site-packages\django\contrib\gis\geos\coordseq.py", line 9, in <module> 
    from django.contrib.gis.geos.libgeos import CS_PTR 
    File "C:\Python25\lib\site-packages\django\contrib\gis\geos\libgeos.py", line 51, in <module> 
    lgeos = CDLL(lib_path) 
    File "C:\Python25\lib\ctypes\__init__.py", line 348, in __init__ 
    self._handle = _dlopen(self._name, mode) 
WindowsError: [Error 126] The specified module could not be found 

因此,我打开libgeos.py并检查指定的行。这只是一个简单的“CDLL(lib_path)”。显然lib_path是GEOS_LIBRARY_PATH。

所以我创建了一个简单的测试:

from ctypes import CDLL 

lgeos = CDLL('libgeo's path') 

仍然有同样的问题。所以它根本无法使用CDLL来使用python加载这个DLL。在这个阶段,我不知道该怎么做。请帮忙。

回答

0

同样的问题在这里。你能不能分享正确的DLL?如果那真的解决了这个问题。或者正在安装OSGeo4W的唯一方法?如果是的话,你遵循什么安装程序?

+1

,则无需粘贴确切路径通过从spatialite站点抓取libgeos库并将这两个DLL解包到system32来解决。 – 2010-10-27 00:32:57

+0

也许这是另一种解决方案。我猜在Windows上最新的libgeo版本有一些问题? – 2010-11-04 16:51:18

+0

我刚安装了OSGeo4W并解决了它。 – 2011-05-18 19:00:23

1

不同的东西出现在我的脑海里,最明显的是:你确实粘贴了DLL文件的路径,而不仅仅是它驻留的文件夹?没有冒犯的意思,只是为了安全起见。

然后,如果存在未解决的依赖性,即DLL的LoadLibrary失败,则可能会因为缺少依赖的其他库而失败。你可以很容易地找到使用Dependency Walker。加载与依赖libgeos和寻找丢失的模块,错误消息等 - 例如,您可能会丢失libgeos-X-Y-Z.dll。

+0

我粘贴的完整路径,这是文件夹+文件名。我只是用Dependecy Walker来检查LIBGEOS_C-1.DLL的依赖。除了某些系统DLL之外,唯一依赖的是位于它旁边的LIBGEOS-3-2-2.DLL。很显然,没有缺失的模块。我在想,如果这是DLL的方式加载更改为lates libgeos。因为在我卸载并安装OSGeo4W之后,我在这个软件中包含了geos dll,然后它就工作了。但我不确定它是否会在未来引入不一致 – 2010-10-06 15:50:08

+0

如果您使用ctypes.util.find_library – dcolish 2010-10-27 00:26:58

3

集GEOS_LIBRARY_PATH使用可变多布尔后Aparently“\”斜杠对我的作品,但现在推出这个错误“模块”对象有没有属性“OSMGeoAdmin”

2

我刚刚安装PostgreSQL 9.1以后遇到同样的问题, postgis 2.0通过Windows安装程序。无需下载其他任何东西。您只需将此目录添加到Windows路径中:C:\PostgreSQL\9.1\binlibgeos_c-1.dll文件所在的任何位置。如果您希望新的环境变量对您的IDE生效,则可能需要重新启动。对于命令行,只需打开一个新的命令提示符。

这样做使得设置GEOS_LIBRARY_PATH可选,因为所需的文件已经在Windows路径中。

这可能不适用于2010年的OP,但对于2012年遇到同样问题的其他人来说,这可能是最简单的解决方案。

+0

这工作。我所要做的只是将libgeos_c-1.dll放到我的django项目中。 – stormlifter 2013-07-12 16:02:50

0

我有同样的问题,并解决它由:

  1. 重新安装http://trac.osgeo.org/osgeo4w/(我的安装文件夹是C:\OSGeo4W64\
  2. 添加一行:

    GEOS_LIBRARY_PATH =“C:\ OSGeo4W64 \ BIN \ geos_c.dll'

设置。PY

(以下这样的回答:https://stackoverflow.com/a/21495785/2314737

这也是在official documentation提到:

When GeoDjango can’t find GEOS, this error is raised:

ImportError: Could not find the GEOS library (tried "geos_c"). Try setting GEOS_LIBRARY_PATH in your settings. The most common solution is to properly configure your Library environment settings or set GEOS_LIBRARY_PATH in your settings.