Я использую 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 из совершенно новой учетной записи отлично работает.
Вы работаете как другой пользователь. Bash (и ваши другие сценарии входа) устанавливают некоторые из ваших переменных пути при запуске в качестве стандартного пользователя, который не может быть установлен при запуске в качестве пользователя apache при запуске.
Apache инициализируется правильно. Вам просто нужно указать, какие пути вы хотите включить, если они вам нужны.
По той же причине вам часто нужно быть более явным при выполнении заданий cron.
Когда вы используете sudo для этого пользователя, часть вашей существующей среды сохраняется, включая ваши переменные пути python. Вам нужно использовать параметр -i с sudo, чтобы имитировать то, что происходит, когда пользователь root сначала входит в систему и запускает apache.
http://www.gratisoft.us/sudo/man/1.8.0/sudo.man.html#i_command
sudo
был вызван - sudo -i
будет очищать среду, sudo -s
будет выполнять только env_reset
очистку среды, которая была настроена с помощью env_reset
в sudoers(5)
. Таким образом, стандартный пользователь /home/pduel/.bashrc
PYTHONPATH
сохранится в среде sudo -s
, но будет удален из среды sudo -i
.
PYTHONPATH
в обоих сценариях?