我正在尝试在 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?