簡體   English   中英

如何在 Python 中讀出*新*操作系統環境變量?

[英]How to read out *new* OS environment variables in Python?

在 Python 中讀取操作系統環境變量是小菜一碟。 嘗試使用以下三行代碼讀取 Windows 中的'PATH'變量:

    #################
    #   PYTHON 3.5  #
    #################
    >> import os
    >> pathVar = os.getenv('Path')
    >> print(pathVar)

        C:\Anaconda3\Library\bin;C:\Anaconda3\Library\bin;
        C:\WINDOWS\system32;C:\Anaconda3\Scripts;C:\Apps\SysGCC\arm-eabi\bin;
        ...

現在對'PATH'變量做一個小改動。 您可以在以下位置找到它們:

控制面板>>系統和安全>>系統>>高級系統設置>>環境變量

如果您在 Python 中運行相同的代碼,則更改不可見! 您必須關閉啟動 Python 會話的終端。 當您重新啟動它並再次運行代碼時,更改將可見。

有沒有辦法立即看到變化——而無需關閉python? 這對於我正在構建的應用程序很重要。

非常感謝:-)


編輯:

Martijn Pieters 向我展示了以下鏈接: Windows 中是否有從命令提示符刷新環境變量的命令?

該鏈接中提到了許多選項。 我選擇了以下一個(因為它只是一個批處理文件,沒有額外的依賴項):

            REM   --------------------------------------------
            REM   |            refreshEnv.bat                |
            REM   --------------------------------------------
    @ECHO OFF
    REM Source found on https://github.com/DieterDePaepe/windows-scripts
    REM Please share any improvements made!

    REM Code inspired by https://stackoverflow.com/questions/171588/is-there-a-command-to-refresh-environment-variables-from-the-command-prompt-in-w

    IF [%1]==[/?] GOTO :help
    IF [%1]==[/help] GOTO :help
    IF [%1]==[--help] GOTO :help
    IF [%1]==[] GOTO :main

    ECHO Unknown command: %1
    EXIT /b 1 

    :help
    ECHO Refresh the environment variables in the console.
    ECHO.
    ECHO   refreshEnv       Refresh all environment variables.
    ECHO   refreshEnv /?        Display this help.
    GOTO :EOF

    :main
    REM Because the environment variables may refer to other variables, we need a 2-step approach.
    REM One option is to use delayed variable evaluation, but this forces use of SETLOCAL and
    REM may pose problems for files with an '!' in the name.
    REM The option used here is to create a temporary batch file that will define all the variables.

    REM Check to make sure we dont overwrite an actual file.
    IF EXIST %TEMP%\__refreshEnvironment.bat (
      ECHO Environment refresh failed!
      ECHO.
      ECHO This script uses a temporary file "%TEMP%\__refreshEnvironment.bat", which already exists. The script was aborted in order to prevent accidental data loss. Delete this file to enable this script.
      EXIT /b 1
    )

    REM Read the system environment variables from the registry.
    FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"`) DO (
      REM /I -> ignore casing, since PATH may also be called Path
      IF /I NOT [%%I]==[PATH] (
        ECHO SET %%I=%%K>>%TEMP%\__refreshEnvironment.bat
      )
    )

    REM Read the user environment variables from the registry.
    FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU\Environment`) DO (
      REM /I -> ignore casing, since PATH may also be called Path
      IF /I NOT [%%I]==[PATH] (
        ECHO SET %%I=%%K>>%TEMP%\__refreshEnvironment.bat
      )
    )

    REM PATH is a special variable: it is automatically merged based on the values in the
    REM system and user variables.
    REM Read the PATH variable from the system and user environment variables.
    FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v PATH`) DO (
      ECHO SET PATH=%%K>>%TEMP%\__refreshEnvironment.bat
    )
    FOR /F "usebackq tokens=1,2,* skip=2" %%I IN (`REG QUERY HKCU\Environment /v PATH`) DO (
      ECHO SET PATH=%%PATH%%;%%K>>%TEMP%\__refreshEnvironment.bat
    )

    REM Load the variable definitions from our temporary file.
    CALL %TEMP%\__refreshEnvironment.bat

    REM Clean up after ourselves.
    DEL /Q %TEMP%\__refreshEnvironment.bat

    ECHO Environment successfully refreshed.

此解決方案適用於我的計算機(64 位 Windows 10)。 環境變量得到更新。 但是,我收到以下錯誤:

    ERROR: The system was unable to find the specified registry key or value.

奇怪.. 我收到一個錯誤,但變量確實得到了更新。


編輯:

當我直接在終端窗口中調用批處理文件'refreshEnv'時,環境變量會得到更新。 但是當我從我的 Python 程序調用它時它不起作用:

    #################################
    #          PYTHON 3.5           #
    #   -------------------------   #
    # Refresh Environment variables #
    #################################
    def refresh(self):
        p = Popen(self.homeCntr.myState.getProjectFolder() + "\\refreshEnv.bat", cwd=r"{0}".format(str(self.homeCntr.myState.getProjectFolder())))
    ###

為什么? 是不是因為 Popen 在另一個 cmd 終端中運行批處理文件,這樣它就不會影響當前的 Python 進程?

在 Windows 上,初始環境變量存儲在注冊表中: HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Environment用於系統變量, HKEY_CURRENT_USER\\Environment用於用戶變量。

使用 Python 中的winreg模塊,您可以輕松查詢這些環境變量,而無需求助於外部腳本:

import winreg
def get_sys_env(name):
    key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, r"System\CurrentControlSet\Control\Session Manager\Environment")
    return winreg.QueryValueEx(key, name)[0]

def get_user_env(name):
    key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, r"Environment")
    return winreg.QueryValueEx(key, name)[0]

(在 Python 2.x 上,改為在第一行使用import _winreg as winreg )。

有了這個,您可以在任何需要最新的 PATH 變量時使用get_sys_env("PATH")而不是os.environ["PATH"] 這比使用外部腳本更安全、更快、更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM