什么是环境变量?
在深入 Python 代码之前,我们先理解环境变量是什么。

环境变量是操作系统在运行时可以使用的、具有特定名称和值的对象,它们通常用于存储配置信息,
- 系统路径:
Path变量告诉操作系统在哪里可以可执行文件(如python.exe,git.exe等)。 - 程序配置:应用程序可以读取自定义的环境变量来获取配置,比如数据库连接字符串、API 密钥等。
- 用户信息:
USERNAME,USERPROFILE等变量存储了当前用户的信息。
环境变量分为两种级别:
- 用户变量:只对当前登录的用户有效。
- 系统变量:对计算机上的所有用户都有效。
使用 Python 读取环境变量
Python 通过内置的 os 模块来与操作系统交互,包括读取环境变量,最核心的函数是 os.environ。
os.environ 的使用
os.environ 是一个类似字典的对象,你可以像操作字典一样操作它。

示例代码:
import os
# --- 1. 获取单个环境变量 ---
# 方法 A:使用 os.environ['KEY'] - 如果变量不存在,会引发 KeyError
try:
python_path = os.environ['Path']
print(f"获取 Path 变量成功(前50个字符): {python_path[:50]}...")
except KeyError:
print("错误:'Path' 环境变量不存在!")
# 方法 B:使用 os.environ.get('KEY') - 如果变量不存在,返回 None(更安全)
home_dir = os.environ.get('USERPROFILE') # 在Windows上,用户主目录通常存储在这里
if home_dir:
print(f"当前用户主目录是: {home_dir}")
else:
print("无法获取用户主目录。")
# --- 2. 获取所有环境变量 ---
# 将 os.environ 转换为字典
all_env_vars = dict(os.environ)
print("\n--- 系统中的部分环境变量 ---")
# 打印前10个变量
for key, value in list(all_env_vars.items())[:10]:
print(f"{key}: {value}")
# --- 3. 检查变量是否存在 ---
if 'TEMP' in os.environ:
print("\n'TEMP' 变量存在,其值为:", os.environ['TEMP'])
else:
print("\n'TEMP' 变量不存在。")
使用 Python 设置环境变量
同样,你可以通过 os.environ 来设置环境变量。但要注意,这种修改仅对当前运行的 Python 进程及其子进程有效,是临时性的。
临时设置环境变量
示例代码:
import os
import subprocess # 用于演示子进程
# --- 1. 设置一个新环境变量 ---
os.environ['MY_NEW_VAR'] = 'Hello from Python!'
print(f"已设置 MY_NEW_VAR 为: {os.environ['MY_NEW_VAR']}")
# --- 2. 修改一个已存在的环境变量 ---
original_home = os.environ.get('USERPROFILE')
if original_home:
os.environ['USERPROFILE'] = original_home + '_MODIFIED_BY_PYTHON'
print(f"已修改 USERPROFILE 为: {os.environ['USERPROFILE']}")
# 建议在程序结束时恢复,避免影响其他代码
os.environ['USERPROFILE'] = original_home
print(f"已恢复 USERPROFILE 为原始值: {os.environ['USERPROFILE']}")
# --- 3. 验证子进程是否能继承 ---
print("\n--- 启动一个子进程来验证环境变量 ---")
# 在 Windows 命令提示符中,使用 echo %VAR_NAME% 来打印变量
# 我们使用 /K 来保持窗口打开,方便查看
command = 'cmd /K echo 当前进程的 MY_NEW_VAR 值是: %MY_NEW_VAR%'
# 使用 shell=True 是为了确保 cmd.exe 能正确解释命令
subprocess.Popen(command, shell=True)
print("已打开一个新的命令提示符窗口,请查看其中的内容。")
重要提示:

- 临时性:当你关闭 Python 脚本或重启电脑后,这些通过
os.environ设置的变量就会消失。 - 大小写:在 Windows 上,环境变量名不区分大小写(
Path和PATH是同一个变量),但 Python 的os.environ会保持你设置时的大小写。
永久性修改环境变量
如果你想让环境变量的修改永久生效,你需要直接修改 Windows 的注册表,这需要管理员权限,并且操作不当可能导致系统不稳定。
警告:直接修改注册表有风险,请务必谨慎!
我们可以使用 Python 的 winreg 模块来完成这个操作。
winreg 模块的使用
环境变量存储在注册表的以下两个位置:
- 系统变量:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment - 用户变量:
HKEY_CURRENT_USER\Environment
示例代码:永久添加一个环境变量
import winreg
def set_persistent_env_var(var_name, var_value, is_system=True):
"""
永久设置一个环境变量。
:param var_name: 变量名
:param var_value: 变量值
:param is_system: True为系统变量,False为用户变量
"""
# 选择要修改的注册表路径
if is_system:
# 系统变量需要管理员权限
key_path = winreg.HKEY_LOCAL_MACHINE
subkey_path = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
else:
# 用户变量不需要管理员权限
key_path = winreg.HKEY_CURRENT_USER
subkey_path = r"Environment"
try:
# 打开或创建注册表项
key = winreg.OpenKey(key_path, subkey_path, 0, winreg.KEY_SET_VALUE)
# 设置值
winreg.SetValueEx(key, var_name, 0, winreg.REG_EXPAND_SZ, var_value)
print(f"成功设置永久环境变量 '{var_name}' = '{var_value}' (类型: {'系统' if is_system else '用户'})")
# 通知系统环境变量已更改
# 这对于让其他应用程序(如已打开的命令提示符)知道变化非常重要
HWND_BROADCAST = 0xFFFF
WM_SETTINGCHANGE = 0x1A
SMTO_ABORTIFHUNG = 0x0002
result = ctypes.c_long()
ctypes.windll.user32.SendMessageTimeoutW(
HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment",
SMTO_ABORTIFHUNG, 5000, ctypes.byref(result)
)
winreg.CloseKey(key)
except PermissionError:
print(f"错误:没有权限修改 {'系统' if is_system else '用户'} 环境变量,请以管理员身份运行此脚本。")
except Exception as e:
print(f"发生未知错误: {e}")
# --- 使用示例 ---
# 注意:运行此脚本修改系统变量时,需要以管理员身份运行Python IDE或命令行
# 导入ctypes以用于SendMessageTimeout
import ctypes
print("--- 准备永久设置环境变量 ---")
# 设置一个用户变量(不需要管理员权限)
set_persistent_env_var('MY_PYTHON_APP_CONFIG', 'C:\AppData\Config', is_system=False)
# 设置一个系统变量(需要管理员权限)
# set_persistent_env_var('MY_GLOBAL_TOOL_PATH', 'C:\GlobalTools', is_system=True)
print("\n操作完成,请重启命令提示符或注销/登录以使更改完全生效。")
如何删除永久环境变量?
删除操作与设置类似,只是使用 winreg.DeleteValue()。
import winreg
def delete_persistent_env_var(var_name, is_system=True):
key_path = winreg.HKEY_LOCAL_MACHINE if is_system else winreg.HKEY_CURRENT_USER
subkey_path = r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment" if is_system else r"Environment"
try:
key = winreg.OpenKey(key_path, subkey_path, 0, winreg.KEY_SET_VALUE)
winreg.DeleteValue(key, var_name)
print(f"成功删除永久环境变量 '{var_name}'")
# 同样需要通知系统
# ... (SendMessageTimeout 代码同上) ...
winreg.CloseKey(key)
except FileNotFoundError:
print(f"错误:环境变量 '{var_name}' 不存在。")
except PermissionError:
print(f"错误:没有权限删除 {'系统' if is_system else '用户'} 环境变量。")
except Exception as e:
print(f"发生未知错误: {e}")
# --- 使用示例 ---
# delete_persistent_env_var('MY_PYTHON_APP_CONFIG', is_system=False)
总结与最佳实践
| 操作 | 方法 | 作用域 | 持久性 | 风险/权限 |
|---|---|---|---|---|
| 读取 | os.environ.get('VAR') |
当前进程 | - | 无 |
| 临时设置 | os.environ['VAR'] = 'val' |
当前进程及其子进程 | 仅限进程运行期间 | 无 |
| 永久设置 | winreg.SetValueEx() |
所有用户/当前用户 | 永久 | 高,需管理员权限(系统变量) |
| 永久删除 | winreg.DeleteValue() |
所有用户/当前用户 | 永久 | 高,需管理员权限(系统变量) |
最佳实践建议:
- 优先使用临时变量:对于大多数脚本和应用程序,使用
os.environ设置临时变量就足够了,这是最安全、最简单的方式。 - 配置文件优于环境变量:对于应用程序的配置,强烈建议使用配置文件(如
.ini,.json,.yaml,.env文件),这样做更易于管理、版本控制和在不同环境(开发、测试、生产)间切换。 - 谨慎修改系统变量:只有当确实需要让所有用户和所有应用程序都能访问某个路径或配置时,才考虑永久性地修改系统环境变量,操作前务必备份,并确保以管理员身份运行。
- 修改后通知系统:使用
winreg修改后,调用SendMessageTimeout通知系统,这样新打开的命令行窗口或应用程序才能立即感知到变化,否则可能需要重启才能生效。
