Python 永久修改環(huán)境變量

最近寫在一個(gè) windows 上快速切換 python 環(huán)境的軟件(PySwitch)的時(shí)候遇到一個(gè)問題谴轮。就是用戶下載后臺(tái),需要用戶手動(dòng)為軟件添加環(huán)境變量破喻,以便在任何地方都可以調(diào)起軟件职祷。后來一想,手動(dòng)添加環(huán)境變量太麻煩了蚁鳖,為什么不在安裝軟件初始化的時(shí)候自動(dòng)去添加環(huán)境變量呢磺芭。想到就動(dòng)手...

于是就百度了一圈,查到可以通過 os.environ 中的 os.environ.setdefault 方法可以修改系統(tǒng)環(huán)境變量醉箕。經(jīng)過實(shí)驗(yàn)使用后發(fā)現(xiàn)钾腺,os.environ 只能影響到當(dāng)前運(yùn)行程序,無法保存到系統(tǒng)中讥裤。無耐只好放棄...

本著不拋棄不放棄的理念放棒,想到 windos 是可以通過 dos 命令 來改變環(huán)境變量的,所以想到了一個(gè)曲線救國(guó)的方法己英,通過 python 來運(yùn)行 dos 命令來修改系統(tǒng)環(huán)境變量间螟。通過查找資料,發(fā)現(xiàn)可以通過 setxreg add(修改注冊(cè)表) 兩命令來修改系統(tǒng)環(huán)境變量损肛。

STEX 和 REG ADD 的優(yōu)劣

  • stex :stex 命令功能強(qiáng)大厢破,使用較為簡(jiǎn)單,但 setx 有截?cái)?1024 字符設(shè)置荧关,所以超過 1024 字符無法使用 stex 命令
  • reg add :沒有字符截?cái)喔绒龋褂蒙陷^ setx 繁瑣

setx 設(shè)置環(huán)境變量

# 用戶環(huán)境變量
setx    key  value

# 系統(tǒng)環(huán)境變量
setx /M    key  value

reg add 設(shè)置環(huán)境變量


# 用戶環(huán)境變量注冊(cè)表位置
set regPath= HKEY_CURRENT_USER\Environment

# 系統(tǒng)環(huán)境變量注冊(cè)表位置
set regPath= HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session" "Manager\Environment

reg add %regPath% /v %key% /t REG_EXPAND_SZ /d "%oldValue%;%value%" /f

在 Python 中使用

SET_ENV=r'''
@echo
set %{key}%={value}
echo %{key}%

if {user}==sys (
    setx /M{key} "%{key}%"
) else (
    setx {key} "%{key}%"
)
'''


ADD_ENV=r'''
@echo off

if {user}==sys (
    set regPath= HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session" "Manager\Environment
) else (
    set regPath= HKEY_CURRENT_USER\Environment
)

set key={key}
set value={value}
:: 判斷是否存在該路徑
reg query %regPath% /v %key% 1>nul 2>nul
if %ERRORLEVEL%==0 (
    :: 取值
    For /f "tokens=3* delims= " %%i in ('Reg Query %regPath% /v %key% ') do (
        if "%%j"=="" (Set oldValue=%%i) else (Set oldValue=%%i %%j)
    )
) else Set oldValue="."

:: 備份注冊(cè)表
reg export %regPath% %~dp0%~n0.reg
:: 寫入環(huán)境變量
if "%oldValue%"=="." (
    reg add %regPath% /v %key% /t REG_EXPAND_SZ /d "%value%" /f
) else (
    reg add %regPath% /v %key% /t REG_EXPAND_SZ /d "%oldValue%;%value%" /f
)
'''

# 連續(xù)運(yùn)行 bat 命令
def runbat(self, bat):
    tmp_bat_file = 'tmp.bat'
    with open(tmp_bat_file, 'w') as f:
        f.writelines(bat)
    self.runcmd(tmp_bat_file)


# 添加環(huán)境變量
def _append_env(self, is_sys, key, value):
    # 運(yùn)行設(shè)置環(huán)境變量命令
    user = 'sys' if is_sys else 'me'
    cmds = ADD_ENV.format(user=user, key=key, value=value)
    self.runbat(cmds)


# 設(shè)置環(huán)境變量
def _set_env(self, is_sys, key, value):
    user = 'sys' if is_sys else 'me'
    cmds = SET_ENV.format(user=user, key=key, value=value)
    self.runbat(cmds)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忍啤,隨后出現(xiàn)的幾起案子加勤,更是在濱河造成了極大的恐慌,老刑警劉巖同波,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳄梅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡未檩,警方通過查閱死者的電腦和手機(jī)戴尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冤狡,“玉大人孙蒙,你說我怎么就攤上這事”ǎ” “怎么了挎峦?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵览妖,是天一觀的道長(zhǎng)枚抵。 經(jīng)常有香客問我寸痢,道長(zhǎng)南蓬,這世上最難降的妖魔是什么卓箫? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任漫雷,我火速辦了婚禮界酒,結(jié)果婚禮上蜒程,老公的妹妹穿的比我還像新娘。我一直安慰自己纪岁,他們只是感情好凑队,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜂科,像睡著了一般顽决。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导匣,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音茸时,去河邊找鬼贡定。 笑死,一個(gè)胖子當(dāng)著我的面吹牛可都,可吹牛的內(nèi)容都是我干的缓待。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渠牲,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旋炒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起签杈,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤瘫镇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后答姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铣除,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年鹦付,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尚粘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敲长,死狀恐怖郎嫁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祈噪,我是刑警寧澤泽铛,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站钳降,受9級(jí)特大地震影響厚宰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一铲觉、第九天 我趴在偏房一處隱蔽的房頂上張望澈蝙。 院中可真熱鬧,春花似錦撵幽、人聲如沸灯荧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗载。三九已至,卻和暖如春链烈,著一層夾襖步出監(jiān)牢的瞬間厉斟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工强衡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擦秽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓漩勤,卻偏偏與公主長(zhǎng)得像感挥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子越败,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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

  • 一触幼、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,745評(píng)論 0 10
  • 前言 Python的創(chuàng)始人為Guido van Rossum。1989年圣誕節(jié)期間究飞,在阿姆斯特丹置谦,Guido為了打...
    依依玖玥閱讀 3,569評(píng)論 6 37
  • 第一章:編譯和安裝SCons第二章:簡(jiǎn)單編譯第三章:編譯相關(guān)的一些事情第四章:編譯和鏈接庫文件第五章:節(jié)點(diǎn)對(duì)象第六...
    仙靈兒閱讀 11,799評(píng)論 0 3
  • 華枝春滿5339閱讀 394評(píng)論 2 8
  • 荊棘小胖,何許人也噪猾?荊棘者霉祸,刺也。道路難走袱蜡。充滿艱辛丝蹭。小胖者,肥也坪蚁。雖非大胖奔穿,然小肉肉不斷。在艱辛的減肥道路上向前...
    猴得住閱讀 382評(píng)論 2 1