Почему никакие библиотеки Python, созданные с помощью MSVC, не загружаются с помощью mod_wsgi? - PullRequest
6 голосов
/ 14 сентября 2010

Я недавно обновился с Python 2.5 до 2.7 (я пробовал 2.6 во время моих хлопот), и хотя все работает нормально из командной строки или с сервера запуска Django, mod_wsgi не может загрузить любой модуль, который содержит DLL (pyd), созданные с помощью MSVC.

Например, если я соберу свои собственные версии pycrypto или lxml, я получу следующую ошибку только от mod_wsgi:

ImportError at /
DLL load failed: The specified module could not be found.

Даже официальные двоичные файлы PIL не смогут импортировать _imaging Cмодуль в mod_wsgi, но это может быть еще одной проблемой.

Однако, если я использую версию pycrypto, созданную с использованием MinGW, где-то вроде http://www.voidspace.org.uk/python/modules.shtml#pycrypto, то он прекрасно импортируется даже в mod_wsgi.Однако я не нахожу это решение удовлетворительным, поскольку единственная причина, по которой я обновил Python, заключалась в том, чтобы избежать необходимости искать предварительно собранные двоичные файлы, и я не могу собрать их самостоятельно, потому что MinGW дает сбой> 50% времени для меня.

EDIT2: я заметил это в Python27 / Lib / distutils / msvc9compiler.py в строках 680-705:

try:
    # Remove references to the Visual C runtime, so they will
    # fall through to the Visual C dependency of Python.exe.
    # This way, when installed for a restricted user (e.g.
    # runtimes are not in WinSxS folder, but in Python's own
    # folder), the runtimes do not need to be in every folder
    # with .pyd's.
    manifest_f = open(manifest_file)
    try:
        manifest_buf = manifest_f.read()
    finally:
        manifest_f.close()
    pattern = re.compile(
        r"""<assemblyIdentity.*?name=("|')Microsoft\."""\
        r"""VC\d{2}\.CRT("|').*?(/>|</assemblyIdentity>)""",
        re.DOTALL)
    manifest_buf = re.sub(pattern, "", manifest_buf)
    pattern = "<dependentAssembly>\s*</dependentAssembly>"
    manifest_buf = re.sub(pattern, "", manifest_buf)
    manifest_f = open(manifest_file, 'w')
    try:
        manifest_f.write(manifest_buf)
    finally:
        manifest_f.close()
except IOError:
    pass

Это, вероятно, объясняет, почему все работает из командной строки, а не в mod_wsgi.Комментирование всего этого, похоже, решает проблему, но не похоже на правильное решение.Вопрос сейчас в том, куда положить msvcr90.dll, чтобы Apache мог его использовать?Я заметил, что папка bin Apache содержит msvcr70.dll и msvcr80.dll, но ввод 90 там не работает.

Ответы [ 3 ]

2 голосов
/ 17 января 2012

У меня была похожая проблема, и в конце концов я нашел решение здесь : загрузите / обновите ваш сервер apache одним из http://www.apachelounge.com/download/.

1 голос
/ 14 сентября 2010

Хотя я ничего не знаю о mod_wsgi, я осмелюсь предположить, что наиболее вероятная причина - отсутствие зависимостей во время выполнения. Возможно, вы захотите проверить свою сборку MSVC с помощью Dependency Walker , который поставляется с MSVC (например, в MSVC 2005 он находится в \ Common7 \ Tools \ Bin \ Depends.Exe). Он покажет вам, какие библиотеки необходимы бинарному файлу.

В качестве другого обходного пути должна быть возможность сборки модулей со статически связанной средой выполнения (см. Свойства проекта -> C / C ++ -> Генерация кода -> Время выполнения - выберите «Многопоточная» (не «Многопоточная DLL»); или , если сборка выполняется из командной строки, убедитесь, что вместо /MD используется /MT). Однако могут возникнуть проблемы, если зависящие от времени выполнения вещи (например, объекты FILE *) пересекают границы модуля.

UPD Если у вас установлено правильное перенаправление VC, причиной может быть проблема с конфигурацией SxS (то есть сам манифест .pyd неверен или отсутствует, или конфликтует с манифестом приложение, которое загружает .pyd). Вы можете использовать утилиту sxstrace, чтобы увидеть, что именно происходит. См. Диагностика ошибок SideBySide .

Кроме того, вы пробовали статическое связывание среды выполнения? Или, что еще лучше, проверьте требования вашего хост-процесса.

0 голосов
/ 29 августа 2014

Я получаю эту ошибку с zmq.Решением было включить манифест python27.dll в файл libzmq.pyd (и он, скорее всего, будет работать для других pyd / dll).Убедитесь, что вы используете все 64-битные или все 32-битные.

"C:\Program Files (x86)\Windows Kits\8.0\bin\x64\mt.exe" -inputresource:C:\windows\system32\python27.dll;#2 -outputresource:libzmq.pyd;#2

См. https://code.google.com/p/pyodbc/issues/detail?id=214

...