django os.environ慎用setdefault操作环境变量

Posted bufufan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django os.environ慎用setdefault操作环境变量相关的知识,希望对你有一定的参考价值。

在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用:

如果程序执行前,系统里已经存在了某环境变量(如ENV=VAL1),此时如果在程序中用setdefault函数对该环境变量设置另一个不同的值(如VAL2),会因为setdefault函数的特性导致无法设置为新值
也是因为上述这一点,如果进程A先设置了环境变量(如ENV=VAL1),而A启动了子进程B,子进程B会继承A进程的所有与环境变量,会导致B运行的时候,程序运行环境里已经存在环境变量ENV,导致如果此时用setdefault函数对该环境变量设置另一个不同的值(如VAL2),也会因为同样的原因导致无法设置为新值
因此,在程序运行中设置系统环境变量的最安全方法还是:

os.environ[‘ENV‘] = ‘VAL‘

 

python 获取系统环境变量 os.environ and os.putenv
从一段code说起 “if "BATCH_CONFIG_INI" in os.environ:” 判断环境变量的值有没有定义

如果定义的话就去环境变量的值,否则就取当前目录下的config.ini文件。

复制代码
if "BATCH_CONFIG_INI" in os.environ:
print "Using custom ini file!"
self.inifile = os.environ["BATCH_CONFIG_INI"]
else:
self.inifile = self.cur_file_dir() + "/config.ini"
self.db_print ("inifile = (%s)" %(self.inifile))
复制代码

用Python Shell设置或获取环境变量的方法:

一、设置系统环境变量

1、os.environ[‘环境变量名称‘]=‘环境变量值‘ #其中key和value均为string类型

2、os.putenv(‘环境变量名称‘, ‘环境变量值‘)

 

二、获取系统环境变量

1、os.environ[‘环境变量名称‘]

2、os.getenv(‘环境变量名称‘)

 

 

celery中创建客户端的文件main:

from celery  import Celery

import os
# 配置celery如果需要用配置文件时去那里加载
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.dev")

# 1.创建celery客户端
celery_app = Celery(‘‘)

# 2.加载配置信息
celery_app.config_from_object(‘celery_tasks.config‘)
# 3.注册异步任务(那些任务可以进入到任务队列)
celery_app.autodiscover_tasks([‘celery_tasks.sms‘, ‘celery_tasks.email‘, ‘celery_tasks.html‘])

以上是关于django os.environ慎用setdefault操作环境变量的主要内容,如果未能解决你的问题,请参考以下文章

重新实践《轻量级DJANGO》这本书

django外使用django ORM

django离线脚本组件

django离线脚本组件

Django:'RUN_MAIN'环境变量的意义

[python] 性能优化工具