2016-07-23 79 views
2

在Python中读出OS环境变量是小菜一碟。请尝试以下三个代码行Windows中读出'PATH'变量:如何在Python中读取* new * OS环境变量?

################# 
    # 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'变量的微小变化。您可以在以下位置找到它们:

Control Panel >> System and Security >> System >> Advanced system settings >> Environment variables

如果您在Python中运行相同的代码,则更改不可见!您必须关闭启动Python会话的终端。当您重新启动并再次运行代码时,更改将会显示。

有没有办法立即看到变化 - 无需关闭python?这对于我正在构建的应用程序非常重要。

太谢谢你了:-)


编辑:

的Martijn Pieters的给我下面的链接: Is there a command to refresh environment variables from the command prompt in 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进程?

+5

很快:你不能。环境变量在启动时为进程设置,并且不会更新。这不仅限于Python。 –

+0

如果这是Linux,这将是[有没有办法改变另一个进程的环境变量?](http://stackoverflow.com/q/205064),但同样的限制适用于Windows。 –

+0

与环境变量和进程内存的解释密切相关(如果不是直接欺骗的话):[是否有命令从Windows命令提示符刷新环境变量?](http://stackoverflow.com/q/171588) –

回答

4

在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)。

有了这个,您可以随时使用get_sys_env("PATH")而不是os.environ["PATH"]任何时候你想要一个最新的PATH变量。这比向外部脚本提出更安全,更快速,更简单。

+0

Nneonneo,你是一个天才! –

+0

明天我会试用你的解决方案,并让你知道结果。谢谢你,兄弟! –

+0

我刚试过。谢谢@nneonneo!它完美的工作! –