Python mod_wsgi не может импортировать из стандартной библиотеки - PullRequest
6 голосов
/ 14 октября 2011

Я создал две среды Python с помощью virtualenv: /usr/local/pythonenv/BASELINE и /usr/local/pythonenv/django1.Оба были созданы с помощью --no-site-packages.Я установил django в среду django1 с помощью easy_install.

В моем файле wsgi.conf есть эта строка для установки интерпретатора Python:

WSGIPythonHome /usr/local/pythonenv/BASELINE

Мой файл django.wsgi начинается как:

import site
site.addsitedir('/usr/local/pythonenv/django1/lib/python2.7/site-packages')
import os
import sys

Но когда я пытаюсь посетить мой сайт, я получаю 500 Ошибка, и httpd / error_log содержит:

[error] Traceback (most recent call last):
[error]   File "/service/usr/local/django_apps/apache/django.wsgi", line 1, in ?
[error]     import site
[error] ImportError: No module named site

Я заблудился из-за того, почему интерпретатор Python не может импортировать егособственная стандартная библиотека.Я даже не уверен, как проверить, использует ли httpd даже интерпретатор в / usr / local / pythonenv / BASELINE, так что это было бы хорошим началом.

Редактировать: Не связано, но я был довольно разорванЯ должен опубликовать это здесь или на ServerFault.Советы по этому вопросу приветствуются.

Редактировать: Так что я смог получить некоторую отладочную информацию благодаря http://code.google.com/p/modwsgi/wiki/DebuggingTechniques. Я изменил свой сценарий django.wsgi, чтобы он содержал

import sys
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'
    print >> environ['wsgi.errors'], sys.path
    print >> environ['wsgi.errors'], sys.prefix
    print >> environ['wsgi.errors'], sys.executable

    response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

Thisпоместите информацию интерпретатора Python в / var / log / httpd / error_log.Вывод ошибки:

[error] ['/usr/local/pythonenv/BASELINE/lib64/python24.zip',     '/usr/local/pythonenv/BASELINE/lib64/python2.4/', '/usr/local/pythonenv/BASELINE/lib64/python2.4/plat-linux2', '/usr/local/pythonenv/BASELINE/lib64/python2.4/lib-tk', '/usr/local/pythonenv/BASELINE/lib64/python2.4/lib-dynload']
[error] /usr/local/pythonenv/BASELINE
[error] /usr/bin/python

Так что sys.path и sys.executable указывают на мою проблему.По какой-то причине sys.path использует некоторые файлы lib, которые не существуют (BASELINE даже не содержит каталог lib64, и он был создан с Python2.7), а sys.executable показывает, что mod_wsgi по-прежнему работает по умолчанию / usr /интерпретатор bin / python, а не интерпретатор в /usr/local/pythonenv/BASELINE/bin.

Не уверен, почему это так, но, по крайней мере, теперь я знаю немного больше.

РЕДАКТИРОВАТЬ: Это решено, но Django по-прежнему перечисляет "Исполняемый файл Python: / usr / bin / python", хотя это должно быть (и, насколько я могу судить, это так, начиная с версии Python: 2.7.2) с использованием / usr /местные / бен / питон.Это нормально?

1 Ответ

4 голосов
/ 14 октября 2011

Ваш mod_wsgi, вероятно, не скомпилирован с Python 2.7. Вы не можете использовать virtualenv для одной версии Python с mod_wsgi, скомпилированной для другой версии Python.

Читайте с:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library

и выполните проверки в этом документе.

...