Django / Apache / mod_wsgi не использует двоичный файл Python virtualenv

#python #django #apache #mod-wsgi #wsgi

#python #django #apache #мод-wsgi #wsgi

Вопрос:

У меня есть virtualenv в / opt / webapps / ff / с собственной установкой Python. В моем конфигурационном файле Apache для WSGIPythonHome установлено значение /opt /webapps /ff (и это определенно используется в некотором качестве, потому что, если я установлю его в немного другой существующий каталог и перезапущу Apache, я получу 504). Но если я, например, assert False где-нибудь в представлении вызываю страницу отладки Django, я вижу эти настройки.PYTHON_BIN является /usr/bin , а не /opt/webapps/ff/bin .

Как мне заставить Apache / mod_wsgi использовать двоичный файл Python моей виртуальной среды? Я думал, что настройка WSGIPythonHome была способом сделать это, но, похоже, это влияет только на то, какой каталог пакетов сайта используется, а не на то, какой двоичный файл используется. Спасибо.

Комментарии:

1. Вы смогли это решить?

Ответ №1:

Это инструкции, которые я использовал, которые, похоже, работают хорошо.

http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

Использование ‘site.addsitedir()’ немного отличается от простого добавления каталога в ‘sys.path’, поскольку функция откроет любые файлы ‘.pth’, расположенные в каталоге, и обработает их. Это необходимо для обеспечения автоматического добавления любых специальных каталогов, связанных с Python eggs, в ‘sys.path’.

Обратите внимание, что, хотя virtualenv включает скрипт ‘activate_this.py ‘, который, как утверждается в документации virtualenv, должен вызываться с использованием ‘execfile()’ в контексте mod_wsgi, вы можете быть осторожны при его использовании. Это связано с тем, что скрипт изменяет ‘sys.prefix’, что на самом деле может вызвать проблемы с работой mod_wsgi или модулей Python, уже загруженных в интерпретатор Python, если код зависит от значения ‘sys.prefix’, которое не меняется. Вместо этого следует использовать уже описанную директиву WSGIPythonHome, если вы хотите связать Python в целом с виртуальной средой.

Несмотря на это, ‘activate_this.скрипт py — это попытка решить проблему с тем, как работает ‘site.addsitedir()’. Это означает, что любые новые каталоги, которые добавляются в ‘sys.path’ с помощью ‘site.addsitedir()’, фактически добавляются в конец. Проблема с этим в контексте mod_wsgi заключается в том, что если WSGIPythonHome не использовался для связывания mod_wsgi с базовой средой virgin, то любые пакеты / модули в основной установке Python все равно будут иметь приоритет над пакетами / модулями в виртуальной среде.

Чтобы обойти эту проблему, что ‘activate_this.py ‘ вызывает ‘site.addsitedir()’, но затем также переупорядочивает ‘sys.path’, поэтому все вновь добавленные каталоги перемещаются в начало ‘sys.path’. Это гарантирует, что там, где в виртуальной среде существуют разные версии пакетов, они будут иметь приоритет над пакетами в основной установке Python.

Как объяснено, потому что ‘activate_this.py ‘ выполняет другие действия, которые могут быть неуместны в контексте mod_wsgi, если не удается установить WSGIPythonHome для указания mod_wsgi в базовой среде virgin, вместо простого вызова ‘site.addsitedir()’ вам следует использовать код:

 ALLDIRS = ['usr/local/pythonenv/PYLONS-1/lib/python2.5/site-packages']

import sys 
import site 

# Remember original sys.path.
prev_sys_path = list(sys.path) 

# Add each new site-packages directory.
for directory in ALLDIRS:
  site.addsitedir(directory)

# Reorder sys.path so new directories at the front.
new_sys_path = [] 
for item in list(sys.path): 
    if item not in prev_sys_path: 
        new_sys_path.append(item) 
        sys.path.remove(item) 
sys.path[:0] = new_sys_path 
  

Если вы все еще хотите использовать
скрипт активации из virtualenv,
затем используйте:

 activate_this = '/usr/local/pythonenv/PYLONS-1/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this))
  

Если тот факт, что ‘sys.prefix’ был
изменение не создает проблемы, тогда
отлично. Если вы видите тонкие необъяснимые
проблемы, которые могут быть связаны с
измените на ‘sys.prefix’, затем используйте
более длинный подход выше
при этом используется ‘site.addsitedir()’
напрямую и переупорядочивает ‘sys.path’
впоследствии.

Здесь также обсуждается эта проблема

http://groups.google.com/group/modwsgi/browse_thread/thread/466823f087070b5f?pli=1

Комментарии:

1. Спасибо, на самом деле это не решило проблему, хотите верьте, хотите нет … но это показалось мне хорошим предложением, когда я его прочитал.

Ответ №2:

У меня была такая же ситуация в приложении Pylons, и в итоге вместо этого я использовал /usr/bin двоичный файл плюс каталог пакетов сайта virtualenv.

Конечно, это была та же версия python…

Комментарии:

1. Спасибо, да, сайт нормально обслуживается таким образом … пока этого не произойдет. Я пытаюсь сделать вещи более переносимыми.

Ответ №3:

Если вы используете virtualenv, вам нужно обязательно активировать его в скрипте WSGI.

 venv_path = "/opt/webapps/ff"
activate_this = os.path.join(venv_path, "bin/activate_this.py")
execfile(activate_this, dict(__file__=activate_this))
  

Комментарии:

1. Спасибо — я думал, что это решит проблему, но когда я вернулся домой и попробовал это, на самом деле этого не произошло. Когда у меня была опечатка ( 'opt/webapps/ff' , пропущена первая косая черта) Я получил ошибку Apache, которая исчезла, когда я исправил it…so он считывался, но это не влияло на то, какой двоичный файл python использовался.

Ответ №4:

Я столкнулся с той же проблемой при установке modoboa (на основе django) в virtualenv.

Мне потребовалось много времени, чтобы найти четкий ответ, поэтому я опубликую его здесь.

Все, что мне нужно было сделать, это добавить две строки в общий файл apache conf (/etc/httpd/conf/httpd.conf в CentOS):

 WSGISocketPrefix /var/run/wsgi ## (location for the PID)
WSGIPythonHome /path/to/virtualenv 
  

И перезапустите Apache