Почему sys.path инициализируется иначе во время запуска, чем при запуске из bash, для Python, встроенного в Apache - PullRequest
1 голос
/ 28 мая 2011

Я использую 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 из новой учетной записи работает нормально.

1 Ответ

0 голосов
/ 28 мая 2011

Вы работаете как другой пользователь.Bash (и другие ваши сценарии входа в систему) устанавливают некоторые переменные пути при работе от имени обычного пользователя, которые могут не устанавливаться при запуске в качестве пользователя apache при запуске.

Apache инициализируется правильно.Вам просто нужно четко указать, какие пути вы хотите включить, если они вам нужны.

По той же причине вам часто нужно быть более явным при выполнении заданий cron.

Когда вы используетеЧтобы стать этим пользователем, часть существующей среды сохранится, включая ваши переменные пути python.Вам необходимо использовать опцию -i с sudo для имитации того, что происходит, когда пользователь root первоначально входит в систему и запускает apache.

http://www.gratisoft.us/sudo/man/1.8.0/sudo.man.html#i_command

...