1

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

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

我也有 cartopy 在普通的 Python 控制台中正常工作,所以这也没有问题。

当代码出现时

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 下失败。

我的配置:

  • 视窗服务器 2008 R2

  • IIS 7.5

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

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

    • 卡托比 0.10
    • 匀称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 所建议的,我尝试msvc[r|p]90.dll在 IIS 中加载文件。我使用了以下代码片段:

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

有趣的是,当我msvc[p|r]90.dll在我的机器上搜索匹配的(32 位)文件并将它们复制到我的 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

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

4

0 回答 0