11

我想确保我们启动 Python 解释器的所有方式都是相同的os.environsys.path

  • 通过 Django 和 Apache mod_wsgi 的 web 请求
  • 定时任务
  • 通过 ssh 进行交互式登录
  • 芹菜职位
  • 通过 systemd 启动的作业

有没有解决这个问题的通用方法?

如果是,那就太好了:它看起来怎么样?

如果不是,那么可悲:每个人都自己解决这个问题。...解决这个问题的好方法是什么?

操作系统:Linux(支持 systemd)

更新

更明确:

  1. 我想sys.path在 web 请求、cron 作业、从 shell 启动的 python 中保持相同...
  2. 我想os.environ在 web 请求、cron 作业、从 shell 启动的 python 中保持相同...

更新2

对于 systemd,我们使用EnvironmentFile

更新3

我们使用 virtualenv

4

4 回答 4

6

您可以使用envdir python 端口(这里是原始的)来管理环境变量。

如果您关心Djangosettings.py ,我建议您以编程方式使用 envdir

您可以以编程方式更新环境(例如:在 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"或者如果您愿意,可以编写一个完整的 shell 脚本而不是别名)。

于 2016-02-10T11:45:48.837 回答
2

正如您在sys.path的文档中看到的那样,它使用环境变量初始化,PYTHONPATH然后使用依赖于安装的默认值 ( site ) 进行初始化。因此,它们旨在有所不同。

但是,您可以-S在解释器调用期间使用该选项:python -S script.py以跳过某些特定于站点的配置挂钩。尽管如此,您的 sys.path.

如果你真的想要os.path['PYTHONPATH'] == sys.path,你应该明确地这样做,正如文档所说:

程序可以出于自己的目的自由修改此列表

放置这些特定操作的标准位置是:

  • 一个sitecustomize模块,通常由系统管理员在 site-packages 目录中创建,可以进行任意配置。
  • 一个usercustomize模块,其意图相同,sitecustomize但仅在ENABLE_USER_SITE为 true 时执行。
  • sys.path直接从脚本自定义到。即:sys.path = os.env['PYTHONPATH']
于 2016-02-10T12:33:24.700 回答
2

在第一次导入 os 模块时捕获此映射,通常在 Python 启动期间作为处理 site.py 的一部分。在此时间之后对环境所做的更改不会反映在 os.environ 中,但直接修改 os.environ 所做的更改除外。

他们都必须使用相同的解释器。如果它们是由同一个用户启动的,它们可能是。

于 2016-02-05T14:06:38.357 回答
-2

我假设您的意思是os.environ['PYTHONPATH'] == sys.path,否则我无法理解这个问题。无论如何,解决方案是使用 virtualenvs。

  1. 设置一个虚拟环境
  2. 编辑 /bin/activate 并添加条目 PYTHONPATH=your-sys-path。
  3. 确保您的 mod_wsgi、celery、cron 作业和 shell 登录(bash_login?)在启动时都激活了 virtualenv,并使用 virtualenv/bin/python 执行。

完毕。

于 2016-02-09T13:09:54.810 回答