IIS isapi-wsgi应用程序中的Cartopy无法导入geos_c.dll

时间:2014-04-16 11:34:13

标签: python iis ctypes shapely isapi-wsgi

我正在尝试在IIS 7下的isapi-wsgi应用程序中使用cartopy。

我有很多应用程序使用isapi-wsgi,所以我100%确定我设置isapi-wsgi的方式是正确的。

我也在正常的Python控制台中正确运行了cartopy,所以这也没问题。

当代码到达时

import cartopy.io.shapereader

失败了。

追溯的相关部分是

Traceback (most recent call last):
  ...
  File "C:\Python27\lib\site-packages\cartopy\__init__.py", line 23, in <module>
    import shapely.speedups
  File "C:\Python27\lib\site-packages\shapely\speedups\__init__.py", line 3, in <module>
    from shapely.geometry import linestring, polygon
  File "C:\Python27\lib\site-packages\shapely\geometry\__init__.py", line 4, in <module>
    from .base import CAP_STYLE, JOIN_STYLE
  File "C:\Python27\lib\site-packages\shapely\geometry\base.py", line 9, in <module>
    from shapely.coords import CoordinateSequence
  File "C:\Python27\lib\site-packages\shapely\coords.py", line 8, in <module>
    from shapely.geos import lgeos
  File "C:\Python27\lib\site-packages\shapely\geos.py", line 81, in <module>
    _lgeos = CDLL("geos_c.dll")
  File "C:\Python27\Lib\ctypes\__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
WindowsError: [Error 126] The specified module could not be found

如前所述,此导入仅在IIS和isapi_wsgi下失败。

我的配置:

  • Windows Server 2008 R2

  • IIS 7.5

  • 安装了所有Python库的Python(x,y)2.7.6.0(32位)

  • 来自http://www.lfd.uci.edu/~gohlke/pythonlibs/

    • Cartopy 0.10
    • Shapely 1.3
    • pyshp 1.2
    • 所有正确的位数和Python版本

IIS中的我的应用程序池配置为允许32位应用程序。

我还使用“Dependency Walker”调查了geos_c.dll的依赖关系。它表明它取决于众所周知的“msvcr90.dll”和“msvcp90.dll”文件。我怀疑DLL加载失败,因为无法解析这些依赖项,但我确实安装了“MS Visual ... Redistributable”。即使将这些DLL复制到各种文件夹,如shapely,虚拟目录,PATH中的不同目录等也无法解决我的问题。

我真的被困在这里,不知道更进一步。有人有什么建议吗?

更新

根据@eryksun的建议,我尝试在IIS中加载msvc[r|p]90.dll个文件。我使用了以下代码片段:

sio = StringIO()
for dll_name in ["msvcp90.dll", "msvcr90.dll"]:
    try:
        print >> sio, "Loading {} ...".format(dll_name),
        handle = ctypes.CDLL(dll_name)
        print >> sio, "successful, {}".format(str(handle))
    except Exception, e:            
        print >> sio, "failed, {}, {}".format(str(type(e)), str(e))

然后这给了我

Loading msvcp90.dll ... failed, <type 'exceptions.WindowsError'>, [Error 126] The specified module could not be found
Loading msvcr90.dll ... failed, <type 'exceptions.WindowsError'>, [Error 126] The specified module could not be found

所以这确实应该是这种情况下所有邪恶的根源。在普通的解释器中,两个调用都成功。

更新2

有趣的是,当我在我的机器上搜索匹配的(32位)msvc[p|r]90.dll文件并将它们复制到我的isapi-wsgi进程的工作目录时,我得到一个完全不同的错误:

 Loading msvcp90.dll ... failed, <type 'exceptions.WindowsError'>, [Error 1114] A dynamic link library (DLL) initialization routine failed
 Loading msvcr90.dll ... failed, <type 'exceptions.WindowsError'>, [Error 1114] A dynamic link library (DLL) initialization routine failed

甚至出现弹出窗口。这似乎与this issue有关。有任何想法吗?我在哪里可以找到这个“版本B”DLL?

0 个答案:

没有答案