(2022.11.01 Tues)
環(huán)境變量environment variable是動態(tài)命名(dynamic-named)的值详民,可以影響電腦中正在運(yùn)行的進(jìn)程的行為吁伺。他們是進(jìn)程所運(yùn)行環(huán)境的一部。比如欺矫,進(jìn)程可以查詢環(huán)境變量TEMP
的值用于找到存放臨時文件的適當(dāng)位置纱新;查詢ev HOME
或USERPROFILE
的值以找到使用當(dāng)前值進(jìn)程用戶的路徑結(jié)構(gòu)(directory structure);當(dāng)打開一個程序時穆趴,查詢PATH
確定程序所在的路徑脸爱。
環(huán)境變量應(yīng)用的典型案例:打開一種編程語言的編譯器,比如Java未妹。用戶在terminal中輸入java
簿废,系統(tǒng)會從PATH
中查找其中哪個路徑下有該可運(yùn)行的文件,一旦找到則開始運(yùn)行教寂。
環(huán)境變量分系統(tǒng)變量和用戶變量捏鱼,比如在Windows系統(tǒng)中可以在環(huán)境變量設(shè)置中看到system variable和user variables。
關(guān)于環(huán)境變量的操作
在系統(tǒng)中
Linux和Mac的UNIX中查看環(huán)境變量的命令為
>> export
declare -x CONDA_DEFAULT_ENV="base"
declare -x CONDA_EXE="/Users/<username>/opt/anaconda3/bin/conda"
declare -x CONDA_PROMPT_MODIFIER="(base) "
declare -x CONDA_PYTHON_EXE="/Users/<username>/opt/anaconda3/bin/python"
declare -x CONDA_SHLVL="1"
declare -x HOME="/Users/<username>"
...
查看特定環(huán)境變量的命令是echo $<var_name>
酪耕,如查看PATH
變量中的內(nèi)容
>> echo $PATH
/usr/local/bin:/usr/local/sbin:/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
注意到Linux和Unix中导梆,一個變量中并列有若干值,這些值之間用冒號:
隔開迂烁,windows系統(tǒng)中用分號;
隔開看尼。
修改環(huán)境變量有多種方式,適用范圍不同盟步,適用于用戶或系統(tǒng)藏斩,可依次嘗試。
- 用戶級ev定義文件:~/.bashrc却盘、~/.profile或~/.bash_profile
- 系統(tǒng)級ev定義文件:/etc/bashrc狰域、/etc/profile或/etc/bash_profile、/etc/environment
更新環(huán)境變量的極簡方式如下黄橘,該方法僅修改當(dāng)前用戶當(dāng)前窗口中的環(huán)境變量兆览,而一旦用戶關(guān)閉窗口,修改將回滾塞关。持久化修改請?jiān)谏厦嫣岬降奈募慕Y(jié)尾加入對應(yīng)指令抬探。
修改
>> export VAR_NAME=xxxxx
>> export PWD=/Users
加入新內(nèi)容
>> export VAR_NAME=$VAR_NAME:xxx
>> export VAR_NAME=xxx:$VAR_NAME
>> export PATH=$PATH:/etc/lib
>> echo $PATH
/usr/local/bin:/usr/local/sbin:/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/etc/lib
在Python中修改
- 使用內(nèi)置的
os
包
>> import os
>> ev = os.environ
>> type(ev)
<class 'os._Environ'>
>> ev
environ({'TERM_SESSION_ID': 'w0t0p0:E6CB3C38-C647-4549-ABF4-82292A4EAC2D',
'SSH_AUTH_SOCK': '/private/tmp/com.apple.launchd.8F8q60v7Nj/Listeners',
'LC_TERMINAL_VERSION': '3.4.16', 'COLORFGBG': '7;0',
'ITERM_PROFILE': 'Default', 'XPC_FLAGS': '0x0', 'PWD': '/Users/jeffcheung',
'SHELL': '/bin/zsh', 'LC_CTYPE': 'UTF-8', 'TERM_PROGRAM_VERSION': '3.4.16',
'TERM_PROGRAM': 'iTerm.app',
'PATH': '/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin',
'LC_TERMINAL': 'iTerm2', 'COLORTERM': 'truecolor', 'TERM': 'xterm-256color',
'HOME': '/Users/jeffcheung',...)
# 獲取
>> os.getenv("PATH")
'/Users/jeffcheung/opt/anaconda3/bin:/Users/jeffcheung/opt/anaconda3/condabin:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin'
>> ev.get("PATH") # 返回相同結(jié)果
(2022.11.03 Thur)
- 使用內(nèi)置的
sys
包
在Python中調(diào)用sys.path
指令,可以返回當(dāng)前的所有路徑(環(huán)境變量)帆赢。這些路徑保存為一個list小压。特別地线梗,在一個.py
腳本中執(zhí)行該命令,則list中index為0的元素代表了該文件所在的路徑怠益。當(dāng)腳本中執(zhí)行import
操作時仪搔,按路徑依次查找需要的module/package。
# /Users/jeffcheung/Documents/blog/2022年/學(xué)習(xí)筆記/sys_path.py
import sys
if __name__ == '__main__':
print(f"sys.path: {sys.path}")
運(yùn)行該腳本溉痢,返回結(jié)果如下僻造,注意list中的第一個元素和該腳本的路徑相同憋他。
>> python sys_path.py
sys.path:
['/Users/jeffcheung/Documents/blog/2022年/學(xué)習(xí)筆記',
'/Users/jeffcheung/opt/anaconda3/lib/python39.zip',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/lib-dynload',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/site-packages',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/site-packages/aeosa',
'/Users/jeffcheung/opt/anaconda3/lib/python3.9/site-packages/locket-0.2.1-py3.9.egg']
(2023.04.16 Sun)
- 在運(yùn)行Python腳本時指定特定環(huán)境變量的值孩饼,并用
python xxx.py
的格式運(yùn)行腳本。注意竹挡,該方法在Linux和Mac中有效镀娶。
格式如
EVN_VAR=VALUE python <xxx.py>
如運(yùn)行腳本test.py
時,指定環(huán)境變量DEBUG為TRUE
>> DEBUG=TRUE python test.py
此時指定的環(huán)境變量揪罕,只在該腳本運(yùn)行的環(huán)境空間中有效(environment space)梯码。
(2023.04.16 Sun)
在.env
文件中定義環(huán)境變量
前面的方法有的需要修改全局環(huán)境變量,如果不同的項(xiàng)目對環(huán)境變量的要求不同好啰,將會產(chǎn)生一些麻煩轩娶。一個通用的方法是在不同的項(xiàng)目中定義針對該項(xiàng)目的環(huán)境變量。具體方法是在項(xiàng)目根目錄中創(chuàng)建一個.env
文件框往,該文件僅供項(xiàng)目專用鳄抒。
.env
是一個文本文件,包含項(xiàng)目/應(yīng)用中需要指定的環(huán)境變量的鍵值對(key-value pairs)椰弊。該文件只保存在項(xiàng)目本地(project local)而勿須保存在源碼控制工具(e.g., github)中许溅。其形式如下
DEBUG=TRUE
CONDA_DEFAULT_ENV=base
各種編程語言都有對應(yīng)的方法讀.env
文件中環(huán)境變量。在Python中可使用loadenv
這個工具包以及其中的loadenv
方法載入.env
的環(huán)境變量秉版。如下面案例贤重,在當(dāng)前路勁中創(chuàng)建.env
文件并寫入PASSCODE=123
這個環(huán)境變量,用dotenv.loadenv
載入環(huán)境變量清焕,并用os.environ
可讀取該變量并蝗。
>> import dotenv
>> dotenv.loadenv()
>> import os
>> os.environ['PASSCODE']
123
dotenv.loadenv
在查找.env
文件時首先在當(dāng)前路徑下尋找,如果當(dāng)前路徑不存在該文件就去parent directory查找秸妥,以此類推滚停。除此之外,還可在加載時顯示地指定.env
路徑
>> dotenv.loadenv("/home/user/z/codes/.env")
-
.env
文件的安全性
很多情況下環(huán)境變量中包含敏感信息諸如密碼和API key等筛峭。顯然這些信息不適合保存在git等源碼控制工具中铐刘。
針對這種情況的標(biāo)準(zhǔn)操作是將.env
排除在提交給源碼控制工具的代碼中。對于Git影晓,只需在.gitignore
文件中加入.env
的信息镰吵。這樣可保證提交代碼時不提交.env
文件檩禾。如果打算提交.env
文件的末班,可加一個.env.exam
或者其他名字的文件到git中疤祭,使代碼使用者可了解需要在本地設(shè)置哪些環(huán)境變量盼产。
Reference
網(wǎng)絡(luò)
1 Understanding Python imports, _init_.py and pythonpath — once and for all, towardsdatascience, Dr Varshita Sher
2 python docs modules.