環(huán)境變量乒融,2022-11-01

(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 HOMEUSERPROFILE的值以找到使用當(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)境變量DEBUGTRUE

>> 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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勺馆,隨后出現(xiàn)的幾起案子戏售,更是在濱河造成了極大的恐慌,老刑警劉巖草穆,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灌灾,死亡現(xiàn)場離奇詭異,居然都是意外死亡悲柱,警方通過查閱死者的電腦和手機(jī)锋喜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來豌鸡,“玉大人嘿般,你說我怎么就攤上這事⊙墓冢” “怎么了炉奴?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛇更。 經(jīng)常有香客問我瞻赶,道長,這世上最難降的妖魔是什么械荷? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任共耍,我火速辦了婚禮,結(jié)果婚禮上吨瞎,老公的妹妹穿的比我還像新娘痹兜。我一直安慰自己,他們只是感情好颤诀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布字旭。 她就那樣靜靜地躺著,像睡著了一般崖叫。 火紅的嫁衣襯著肌膚如雪遗淳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天心傀,我揣著相機(jī)與錄音屈暗,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛养叛,可吹牛的內(nèi)容都是我干的种呐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼弃甥,長吁一口氣:“原來是場噩夢啊……” “哼爽室!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起淆攻,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤阔墩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓶珊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啸箫,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年艰毒,在試婚紗的時候發(fā)現(xiàn)自己被綠了筐高。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡丑瞧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜀肘,到底是詐尸還是另有隱情绊汹,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布扮宠,位于F島的核電站西乖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坛增。R本人自食惡果不足惜获雕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望收捣。 院中可真熱鬧届案,春花似錦、人聲如沸罢艾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咐蚯。三九已至童漩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間春锋,已是汗流浹背矫膨。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侧馅。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓直奋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親施禾。 傳聞我的和親對象是個殘疾皇子脚线,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容