Python: обеспечить, что os.environ и sys.path равны: веб-запросы, shell, cron, сельдерей

Я хочу убедиться, что os.environ и sys.path идентичны для всех способов запуска интерпретатора Python:

  • веб-запросы через Django и Apache mod_wsgi
  • Работы Cron
  • Интерактивные логины через ssh
  • Работы по сельдеву.
  • Задания, запущенные через systemd

Есть ли общий способ решить эту проблему?

Если да, отлично: как это выглядит?

Если нет, грустно: все решают это самостоятельно.... Что такое хороший способ решить эту проблему?

Операционная система: Linux (с поддержкой systemd)

Обновление

Более явный:

  • Я хочу, чтобы sys.path был одинаковым в веб-запросах, заданиях cron, python запускался из оболочки,...
  • Я хочу, чтобы os.environ был одинаковым в веб-запросах, заданиях cron, python запускался из оболочки,...

Update2

Для systemd мы используем EnvironmentFile

Update3

Мы используем virtualenv

Ответ 1

Вы можете использовать envdir порт python (здесь оригинал) для управления переменными окружения,

Если вы только обеспокоены Django, я предлагаю использовать envdir из settings.py программно

Вы можете программно обновлять среду (например: в файле wsgi, django manage.py, settings.py и т.д.)

import envdir
import os

# print os.environ['FOO']  # would raise a KeyError

path = '../envdir/prod'
if not os.path.isdir(path):
    raise ValueError('%s is not a dir' % path)
envdir.Env(path)
print os.environ['FOO']

или вы можете запустить свой процесс через envdir в командной строке, например: envdir envs/prod/ python manage.py runserver

Я предлагаю создавать псевдонимы для python, pip и т.д. (так как вы не хотите перезаписывать собственный python системы), например: alias python-mycorp="envdir /abs/path/to/envs/prod/ python" (или, если хотите, написать полную оболочку script вместо псевдоним).

Ответ 2

Это сопоставление фиксируется при первом вводе модуля os, как правило, во время запуска Python как часть обработки site.py. изменения к окружающей среде, сделанной после этого времени, не отражены в os.environ, за исключением изменений, внесенных путем изменения os.environ напрямую.

Все они должны использовать один и тот же интерпретатор. Если они запускаются одним и тем же пользователем, они, вероятно, есть.

Ответ 3

Как вы можете видеть в документации sys.path, она инициализируется переменной окружения PYTHONPATH, а затем зависит от установки default (site). Поэтому они должны быть разными.

Но вы можете использовать опцию -S во время вызова интерпретатора: python -S script.py, чтобы пропустить какой-либо привязку конфигурации конкретного сайта. Тем не менее, в вашем sys.path вы по-прежнему будете иметь стандартную библиотеку.

Если вы действительно хотите os.path['PYTHONPATH'] == sys.path, вы должны сделать это явно, так как в документации говорится:

Программа может свободно изменять этот список для своих целей

Стандартными местами для таких конкретных манипуляций являются:

  • A sitecustomize, обычно созданный системным администратором в каталоге сайтов-пакетов, который может выполнять произвольные конфигурации.
  • A usercustomize модуль, намерение которого совпадает с sitecustomize, но выполняется только в том случае, если ENABLE_USER_SITE истинно.
  • Настройка sys.path непосредственно из script. I.e: sys.path = os.env['PYTHONPATH'].

Ответ 4

Я собираюсь предположить, что вы имели в виду os.environ ['PYTHONPATH'] == sys.path, потому что иначе я не могу понять вопрос. Во всяком случае, решение было бы использовать virtualenvs.

  • Настройка виртуального файла
  • Отредактируйте/bin/активируйте и добавьте запись PYTHONPATH = ваш-sys-путь.
  • Убедитесь, что ваши задания mod_wsgi, celery, cron и вход в систему (bash_login?) активируют virtualenv при запуске и используют виртуальный /bin/python для выполнения.

Готово.