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

Недавно я обновил Python 2.5 до 2.7 (я пробовал 2.6 во время моих проблем), и хотя все работает нормально из командной строки или в Django runserver, 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"""|)""",
        re.DOTALL)
    manifest_buf = re.sub(pattern, "", manifest_buf)
    pattern = "\s*"
    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 не работает.

6
задан Kyle MacFarlane 14 September 2010 в 11:25
поделиться