Я создал две среды 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 /местные / бен / питон.Это нормально?