Python:确保os.environ和sys.path相等:web-requests,shell,cron,celery

时间:2016-02-05 12:05:52

标签: python django environment-variables sys.path

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

  • 通过Django和Apache mod_wsgi
  • 的Web请求
  • Cron jobs
  • 通过ssh进行交互式登录
  • 芹菜工作
  • 通过systemd
  • 启动作业

有解决这个问题的常用方法吗?

如果是,那很好:它看起来如何?

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

操作系统:Linux(具有systemd支持)

更新

更明确:

  1. 我希望sys.path在Web请求中相同,cron作业,从shell启动的python,...
  2. 我希望os.environ在Web请求中相同,cron作业,从shell启动的python,...
  3. UPDATE2

    对于systemd,我们使用EnvironmentFile

    UPDATE3

    我们使用virtualenv

4 个答案:

答案 0 :(得分:6)

您可以使用envdir python端口(here is the original)来管理环境变量。

如果您关注 Django ,我建议您以settings.py编程方式使用envdir

您可以通过编程方式更新环境(例如:在wsgi文件中,django的manage.pysettings.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脚本而不是别名)。

答案 1 :(得分:2)

  

第一次导入os模块时捕获此映射,   通常在Python启动期间作为处理site.py的一部分。变化   在此时间之后制造的环境没有反映出来   os.environ,除了直接修改os.environ所做的更改。

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

答案 2 :(得分: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为真时执行。
  • 直接从脚本自定义sys.path。 I.e:sys.path = os.env['PYTHONPATH']

答案 3 :(得分:-2)

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

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