核心概念:进程 vs. 系统环境变量
要理解一个关键点:

- 进程环境变量:每个正在运行的程序(进程)都有自己的环境变量空间,当一个进程(比如你的 Python 脚本)启动另一个进程(比如子进程
os.system())时,它会将自己的环境变量副本传递给子进程。 - 系统环境变量:这些变量是操作系统级别的,对所有用户和所有新启动的进程都有效(或对当前用户有效)。
Python 的 os.environ 操作的是当前进程及其子进程的环境变量,它不会直接修改系统的永久环境变量。
使用 os.environ (最常用)
这是在 Python 中操作环境变量的标准方法,它让你可以获取、设置和删除当前进程的环境变量。
设置环境变量
import os
# 设置一个新的环境变量
os.environ['MY_APP_VAR'] = 'hello_python'
# 修改一个已存在的环境变量
os.environ['PATH'] = '/my/custom/path:' + os.environ['PATH']
print(f"MY_APP_VAR is set to: {os.environ['MY_APP_VAR']}")
注意:os.environ 的值必须是字符串,如果你尝试设置一个非字符串类型(如整数),Python 会抛出 TypeError。
获取环境变量
import os
# 安全地获取环境变量(如果不存在,返回 None)
value = os.environ.get('MY_APP_VAR')
if value:
print(f"Got value: {value}")
else:
print("MY_APP_VAR is not set.")
# 获取不存在的变量,可以设置默认值
value = os.environ.get('NON_EXISTENT_VAR', 'default_value')
print(f"Got default value: {value}")
删除环境变量
import os
# 首先确保变量存在
if 'MY_APP_VAR' in os.environ:
del os.environ['MY_APP_VAR']
print("MY_APP_VAR has been deleted.")
else:
print("MY_APP_VAR was not set.")
为子进程设置环境变量
当你使用 os 或 subprocess 模块启动一个新进程时,默认情况下,子进程会继承父进程(你的 Python 脚本)的所有环境变量。

import os
import subprocess
# 在当前脚本中设置一个变量
os.environ['CHILD_TEST_VAR'] = 'this is for the child'
# 启动一个子进程(打印环境变量的命令)
# 在 Linux/macOS 中,可以使用 'env' 命令查看环境变量
# 在 Windows 中,可以使用 'set' 命令
print("--- Parent Process Environment ---")
print(f"CHILD_TEST_VAR in parent: {os.environ.get('CHILD_TEST_VAR')}")
print("\n--- Child Process Environment ---")
# 使用 shell=True 来执行命令字符串
subprocess.run('echo $CHILD_TEST_VAR', shell=True, check=True)
# 如果你只想传递特定的环境变量给子进程
custom_env = os.environ.copy() # 复制当前环境
custom_env['ONLY_FOR_CHILD'] = 'a secret'
subprocess.run('echo ONLY_FOR_CHILD is set to: $ONLY_FOR_CHILD', env=custom_env, shell=True)
在 Shell 中设置 (临时)
如果你只是想在运行 Python 脚本时临时传入一些环境变量,可以在运行脚本前,在终端中设置它们。
语法:VARIABLE_NAME=value python your_script.py
示例:
假设你的 Python 脚本 read_env.py 内容如下:
# read_env.py
import os
print(f"The API_KEY is: {os.environ.get('API_KEY', 'Not set')}")
在终端中,你可以这样运行:
# 临时设置 API_KEY 并运行脚本 $ API_KEY=12345 python read_env.py The API_KEY is: 12345 # 再次运行,变量未设置 $ python read_env.py The API_KEY is: Not set
永久修改系统环境变量 (高级操作)
警告:直接从 Python 脚本修改系统级的永久环境变量通常是不推荐的,因为这会改变系统配置,可能带来安全风险和副作用,更好的做法是指导用户手动修改配置文件。
如果你确实需要从 Python 脚本中实现这一点,你需要修改特定于 Linux 发行版的配置文件。
修改用户级配置文件 (推荐)
通常是指 ~/.bashrc, ~/.profile, 或 ~/.zshrc (如果你使用 zsh)。
import os
# 要设置的变量
variable_name = 'MY_PERMANENT_VAR'
variable_value = '/opt/my_app/bin'
# 获取家目录
home_dir = os.path.expanduser('~')
# 确定要修改的文件 (这里以 .bashrc 为例)
config_file = os.path.join(home_dir, '.bashrc')
# 要写入的行
export_line = f'\nexport {variable_name}={variable_value}\n'
# 检查是否已经存在,避免重复添加
if f'export {variable_name}=' not in open(config_file).read():
with open(config_file, 'a') as f:
f.write(export_line)
print(f"Successfully added {variable_name} to {config_file}")
print("Please run 'source ~/.bashrc' or open a new terminal to apply the changes.")
else:
print(f"{variable_name} is already set in {config_file}")
如何生效:
运行这个脚本后,你需要重新打开终端或者在当前终端执行 source ~/.bashrc,新设置的环境变量才会对你生效。
修改系统级配置文件 (需要管理员权限)
这些文件是所有用户共享的,修改需要 sudo 权限。
/etc/environment:简单的KEY="value"格式,适合设置简单的 PATH。/etc/profile:系统级的用户配置文件。/etc/profile.d/:存放各个脚本的目录,推荐在这里添加新的脚本。/etc/bash.bashrc:系统级的 bash 配置文件。
示例 (修改 /etc/environment - 需要root权限):
import os
# 这个脚本必须以 root 权限运行
if os.geteuid() != 0:
print("This script must be run as root to modify system files.")
exit(1)
variable_name = 'GLOBAL_SYSTEM_VAR'
variable_value = '/usr/local/global'
config_file = '/etc/environment'
# 读取现有内容
with open(config_file, 'r') as f:
content = f.read()
# 构建新的行
new_entry = f'{variable_name}="{variable_value}"'
# 替换或添加
if f'{variable_name}=' in content:
# 替换现有行
updated_content = content.replace(f'{variable_name}=".*"', new_entry)
else:
# 添加新行
updated_content = content + f'\n{new_entry}\n'
# 写回文件
with open(config_file, 'w') as f:
f.write(updated_content)
print(f"Successfully updated {config_file}. A reboot may be required for all users.")
总结与最佳实践
| 场景 | 推荐方法 | 示例 | 作用范围 |
|---|---|---|---|
| 在 Python 脚本内部使用 | os.environ |
os.environ['MY_VAR'] = 'value' |
当前 Python 进程及其所有子进程。 |
| 为当前 shell 会话临时设置 | Shell 命令 | MY_VAR=value python script.py |
仅影响当前命令行执行的那个进程。 |
| 为用户永久设置 (推荐) | 修改 ~/.bashrc 等文件 |
echo 'export MY_VAR=value' >> ~/.bashrc |
对当前用户永久生效,需 source 或重启终端。 |
| 为系统所有用户永久设置 | 修改 /etc/environment 等文件 |
sudo echo 'MY_VAR="value"' >> /etc/environment |
对系统所有用户永久生效,通常需重启。 |
最佳实践建议:
- 优先使用
os.environ:如果你的变量只服务于你的 Python 应用及其调用的子程序,这是最安全、最直接的方式。 - 避免从 Python 直接修改系统文件:除非你是在编写一个系统配置工具,否则让用户手动修改配置文件是更清晰、更安全的做法。
- 使用
.env文件:对于应用开发,一个非常流行的模式是使用.env文件来存储配置和密钥,然后在 Python 启动时加载它,这既避免了硬编码,也无需修改系统环境变量,可以使用python-dotenv库来实现。
