在Python中读取OS环境变量是一件小事。尝试以下三个代码行来读取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向我展示了以下链接: 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进程吗?
答案 0 :(得分: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
。)
有了这个,只要你想要一个最新的PATH变量,你就可以使用get_sys_env("PATH")
而不是os.environ["PATH"]
。这比外壳脚本更安全,更快速,更简单。