我須要在python腳本中設置一些環境變量,而且我但願從python調用的全部其餘腳本(shell腳本)(將是子進程)來查看設置的環境變量。 該值爲數字。 python
若是我作os.environ["DEBUSSY"] = 1
,它抱怨說1
必須是字符串。 我還想知道一旦設置好如何在python(在腳本的後半部分)中讀取環境變量。 shell
您可使用os.environ
詞典來訪問環境變量。 函數
如今,我遇到的一個問題是,若是我嘗試使用os.system
運行用於設置環境變量的批處理文件(在**。bat *文件中使用SET命令),則它實際上不會爲python環境設置它們(但對於使用os.system
函數建立的子進程)。 爲了實際獲取在python環境中設置的變量,我使用如下腳本: this
import re import system import os def setEnvBat(batFilePath, verbose = False): SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE) SetEnvFile = open(batFilePath, "r") SetEnvText = SetEnvFile.read() SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText) for SetEnvMatch in SetEnvMatchList: VarName=SetEnvMatch[0] VarValue=SetEnvMatch[1] if verbose: print "%s=%s"%(VarName,VarValue) os.environ[VarName]=VarValue
您應該將字符串值分配給環境變量。 spa
os.environ["DEBUSSY"] = "1"
code
若是要讀取或打印環境變量,請使用 對象
print os.environ["DEBUSSY"]
繼承
此更改僅對分配了當前過程的當前過程有效,不會永久更改該值。 子進程將自動繼承父進程的環境。 進程
os.environ
行爲相似於python字典,所以能夠執行全部常見的字典操做。 除了其餘答案中提到的get
和set
操做以外,咱們還能夠簡單地檢查鍵是否存在 圖片
Python 3
對於python 3,字典使用in關鍵字而不是has_key
>>> import os >>> 'HOME' in os.environ # Check an existing env. variable True ...
Python 2
>>> import os >>> os.environ.has_key('HOME') # Check an existing env. variable True >>> os.environ.has_key('FOO') # Check for a non existing variable False >>> os.environ['FOO'] = '1' # Set a new env. variable (String value) >>> os.environ.has_key('FOO') True >>> os.environ.get('FOO') # Retrieve the value '1'
使用os.environ
須要注意一件事:
儘管子進程從父進程繼承了環境,可是我最近遇到了一個問題,並弄清楚了,若是在運行python腳本時有其餘腳本更新環境,那麼再次調用os.environ
不會反映最新值 。
從文檔摘錄:
首次導入os模塊時(一般是在Python啓動期間做爲處理site.py的一部分)捕獲了此映射。 此時間以後對環境所作的更改不會反映在os.environ中,除非直接經過修改os.environ進行更改。
os.environ.data
是一個dict對象,它存儲全部環境變量,其中包含全部環境值:
>>> type(os.environ.data) # changed to _data since v3.2 (refer comment below) <type 'dict'>
當您使用環境變量(添加/修改/刪除變量)時,一個好的作法是在函數完成時恢復之前的狀態。
您可能須要相似此問題中描述的modified_environ
上下文管理器之類的東西來還原環境變量。
經典用法:
with modified_environ(DEBUSSY="1"): call_my_function()
設置變量:
使用鍵的項目分配方法:
import os os.environ['DEBUSSY'] = '1' #Environ Variable must be string not Int
獲取或檢查其是否存在,
因爲os.environ是一個實例,所以您能夠嘗試對象方式。
方法1:
os.environ.get('DEBUSSY') # this is error free method if not will return None by default
將得到'1'
做爲返回值
方法2:
os.environ['DEBUSSY'] # will throw an key error if not found!
方法3:
'DEBUSSY' in os.environ # will return Boolean True/False
方法4:
os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements