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'])


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM