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

1

Я использую 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", или "Sudo/etc/init.d/apache2 начать", это инициализирует правильно, и приложение показывает выше:

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/rc 2.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 script раньше и позже в последовательности запуска и получил равномерно плохие результаты. Загрузка apache в последний раз при запуске получает дисфункциональный sys.path; Загрузка его из оболочки сразу после этого правильно загружается.

Вопрос опять же в том, почему инициализация sys.path по-разному запускается как процесс запуска, чем запуск из оболочки?

Follow- до

site.py не запускается инициализацией Python. Теперь я вижу ошибки mod_wsgi, "неспособные импортировать" модуль сайта. Ошибки начали появляться после предоставления значения WSGIPythonPath в Apach2.conf, хотя симптомы sys.path были там все время.

Есть что-то о комбинации chrooting Apache и начиная с rС#.d-скриптов, которые нарушают загрузку сайта Python site.py.

Запуск Apache из оболочки через sudo или sudo -i из совершенно новой учетной записи отлично работает.

  • 0
    Каково значение переменной среды PYTHONPATH в обоих сценариях?
  • 0
    Это похоже на проблему с Ubuntu, а не на Python или httpd.
Показать ещё 2 комментария
Теги:
mod-wsgi

1 ответ

0

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

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

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

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

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

  • 0
    Я считаю, что пользователь является пользователем root в обоих случаях.
  • 1
    @pduel, это зависит от того, как sudo был вызван - sudo -i будет очищать среду, sudo -s будет выполнять только env_reset очистку среды, которая была настроена с помощью env_reset в sudoers(5) . Таким образом, стандартный пользователь /home/pduel/.bashrc PYTHONPATH сохранится в среде sudo -s , но будет удален из среды sudo -i .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню