Cartopy в приложении IIS isapi-wsgi не может импортировать geos_c.dll

Я пытаюсь использовать cartopy в приложении isapi-wsgi под IIS 7.

У меня много приложений, работающих с 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.

Моя конфигурация:

  • Windows Server 2008 R2

  • ИИС 7.5

  • Python(x,y) 2.7.6.0 со всеми установленными Python-библиотеками (32 бита)

  • Из http://www.lfd.uci.edu/~gohlke/pythonlibs/:

    • Cartopy 0.10
    • Стройный 1.3
    • пышп 1.2
    • все с правильной разрядностью и версией Python

Мой пул приложений в IIS настроен на разрешение 32-битных приложений.

Я также исследовал зависимости geos_c.dll с помощью «Dependency Walker». Это показывает, что это зависит от известных файлов «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

Интересно, что когда я ищу подходящие (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

и даже появляется всплывающее окно. Похоже, это связано с этой проблемой. Любые идеи? Где я могу найти эту DLL "версии B"?


person Thorsten Kranz    schedule 16.04.2014    source источник
comment
Спасибо за Ваш ответ. Завтра утром проверю.   -  person Thorsten Kranz    schedule 16.04.2014
comment
Я попробовал ваше предложение. Результаты см. в моем обновлении.   -  person Thorsten Kranz    schedule 17.04.2014
comment
Вероятно, проще всего встроить манифест в geos_c.dll, например. с mt.exe -manifest geos_c.dll.MANIFEST -outputresource:geos_c.dll;2, где манифест <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> </assembly>   -  person cgohlke    schedule 17.04.2014
comment
Я определенно не могу участвовать в этом обсуждении - мои знания о DLL слишком ограничены. Вы знаете об истории версии A/B?   -  person Thorsten Kranz    schedule 17.04.2014
comment
@cgohlke: Ваше решение действительно работает. Было бы здорово, если бы вы могли поместить свой текст в ответ и, возможно, вкратце объяснить, что он делает. Тогда я бы немедленно проголосовал за это. Кстати, спасибо за вашу большую работу для экосистемы Python.   -  person Thorsten Kranz    schedule 17.04.2014
comment
Пока вы ждете ответа Кристофа, вы можете прочитать Устранение неполадок в изолированных приложениях C/C++ и параллельных сборках.   -  person Eryk Sun    schedule 18.04.2014
comment
Спасибо за эту подсказку.   -  person Thorsten Kranz    schedule 18.04.2014
comment
@cgohlke - есть ответ на это? я отправил вам письмо по электронной почте напрямую - я пытаюсь решить эту проблему: github.com/ Toblerity/Shapely/issues/104#issuecomment-110198935, но я не понимаю ваш комментарий здесь   -  person user1441998    schedule 09.06.2015
comment
Этот комментарий больше не актуален для последних сборок.   -  person cgohlke    schedule 09.06.2015