2016-07-23 1 views
2

PythonでOS環境変数を読み出すことは、ケーキの一部です。 Windowsで'PATH'変数を読み出すために、次の3つのコード行を試してみてください:*新しい* OS環境変数をPythonでどのように読み込むのですか?

################# 
    # 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を閉じる必要はありませんか?これは私が構築しているアプリケーションにとって重要です。


EDIT :-)どうもありがとうございます。そのリンクに記載された多くのオプションがあります 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_CURRENT_USER\Environmentのレジストリに格納されます。

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を使用):Pythonでwinregモジュールを使用して

、あなたは外部スクリプトに頼ることなく、容易にこれらの環境変数を照会することができます。

これで、最新のPATH変数が必要な場合はいつでもos.environ["PATH"]の代わりにget_sys_env("PATH")を使用できます。これは、より安全で、速く、複雑ではなく、外部のスクリプトに砲撃するよりも簡単です。

+0

Nneonneo、あなたは天才です! –

+0

明日あなたのソリューションを試し、結果をお知らせします。ありがとう、男! –

+0

私はそれを試しました。ありがとう@nneonneo!それは完全に動作します! –

関連する問題