Я использую Python, встроенный в Apache с использованием modwsgi, и обнаружил, что sys.path не инициализируется правильно, когда Apache запускается из папки запуска rc2.d, чем при запуске из оболочки.
Версии:
Ubuntu Lucid 10.04
Apache 2.2
Python 2.6
mod_wsgi 3.3
Во-первых, я тестирую инициализацию с помощью этого приложения:
import sys
import os
def application(environ, start_response):
status = '200 OK'
output = ['version %s\n'%sys.version]
output.append('sys.prefix = %s \n' % repr(sys.prefix))
output.append('sys.exec_prefix = %s \n' % repr(sys.exec_prefix))
output.append('sys.path = %s \n' % repr(sys.path))
output.append('env.PYTHONHOME = %s\n' % repr(os.environ.get('PYTHONHOME')))
output.append('env.PATH = %s\n' % repr(os.environ.get('PATH')))
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(sum([len(o) for o in output])))]
start_response(status, response_headers)
return output
Когда apache2 запускается из bash, через 'sudo apache2ctl start' или 'sudo /etc/init.d/apache2 start', он инициализируется правильно, и приложение выше показывает:
version 2.6.5 (r265:79063, Apr 16 2010, 14:15:55)
[GCC 4.4.3]
sys.prefix = '/usr'
sys.exec_prefix = '/usr/local'
sys.path = ['/usr/local/lib/python2.6/dist-packages/WebOb-1.0.7-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/twiddler-0.9.1-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/elementtree-1.2.7_20070827_preview-py2.6.egg', '/usr/local/lib/python2.6/dist-packages/lxml-2.3-py2.6-linux-x86_64.egg', '/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/local/lib/python2.6/lib-dynload', '/usr/lib/python2.6/dist-packages', '/usr/lib/pymodules/python2.6', '/usr/local/lib/python2.6/dist-packages', '/usr/local/lib/python2.6/dist-packages']
env.PYTHONHOME = '/usr:/usr/local'
env.PATH = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin'
Когда apache2 запускается из /etc/rc2.d во время загрузки, он не инициализируется правильно, и приложение показывает:
version 2.6.5 (r265:79063, Apr 16 2010, 14:15:55)
[GCC 4.4.3]
sys.prefix = '/usr'
sys.exec_prefix = '/usr/local'
sys.path = ['/usr/lib/python2.6', '/usr/lib/python2.6/plat-linux2', '/usr/lib/python2.6/lib-tk', '/usr/lib/python2.6/lib-old', '/usr/local/lib/python2.6/lib-dynload']
env.PYTHONHOME = '/usr:/usr/local'
env.PATH = '/sbin:/usr/sbin:/bin:/usr/bin'
Критические каталоги не найдены, включая dist-пакеты.
Я пытался переместить скрипт apache раньше и позже в последовательности запуска и получил одинаково плохие результаты.При загрузке apache последней при запуске получает дисфункциональный sys.path;загрузка его из оболочки, сразу же после этого, загружается правильно.
Опять вопрос: почему инициализация sys.path запускается иначе, чем процесс запуска из оболочки?
Follow-up:
site.py не запускается при инициализации Python.Теперь я вижу ошибки mod_wsgi "невозможно импортировать модуль" сайта ".Ошибки начали появляться после предоставления значения WSGIPythonPath в Apach2.conf, хотя симптомы sys.path были там все время.
Есть что-то в комбинации хромирования Apache и запуска из сценариев rc # .d, которыенарушает загрузку site.py Python.
Запуск Apache из оболочки через sudo или sudo -i из новой учетной записи работает нормально.