下面我将从临时设置、永久设置(用户级别、系统级别),以及在 Python 代码中读取和使用这几个方面,为你提供一份详细、清晰的指南。

核心概念:export 和 .bashrc
在开始之前,你需要理解两个核心概念:
export命令:export是一个 Shell 命令,用于将一个 Shell 变量设置为“环境变量”,环境变量与普通 Shell 变量的区别在于,它会被传递给该 Shell 启动的所有子进程,Python 解释器就是由 Shell 启动的子进程,所以它能接收到export过的变量。- Shell 配置文件:如
.bashrc,.zshrc,.profile等,这些文件是 Shell 启动时自动执行的脚本,你把export命令写入这些文件,就能让环境变量在每次登录或打开新终端时自动加载,实现“永久”设置。
临时设置(仅当前终端会话有效)
这种方法最简单,但只在当前打开的终端窗口中有效,关闭终端后,变量就会消失。
直接在终端中设置并使用
# 设置一个名为 MY_API_KEY 的环境变量,值为 '12345' export MY_API_KEY='12345' # 设置一个 Python 路径 export PYTHONPATH='/home/user/my_project/src' # 验证变量是否已设置 echo $MY_API_KEY # 输出: 12345 echo $PYTHONPATH # 输出: /home/user/my_project/src
在 Python 脚本中读取

在同一个终端中创建一个 Python 文件 test_env.py:
# test_env.py
import os
# 使用 os.environ 获取环境变量
api_key = os.environ.get('MY_API_KEY')
python_path = os.environ.get('PYTHONPATH')
print(f"从环境变量中读取到的 API Key 是: {api_key}")
print(f"PYTHONPATH 是: {python_path}")
# 如果变量不存在,os.environ.get() 会返回 None
# 如果变量不存在且你想设置默认值: os.environ.get('VAR_NAME', 'default_value')
运行这个 Python 脚本:
python3 test_env.py
输出:
从环境变量中读取到的 API Key 是: 12345
PYTHONPATH 是: /home/user/my_project/src
永久设置(推荐)
如果你希望环境变量在每次登录或打开新终端时都自动生效,需要将其写入 Shell 的配置文件。

注意:根据你使用的 Linux 发行版和默认 Shell,配置文件可能不同,最常见的是 .bashrc(用于 Bash Shell)和 .zshrc(用于 Zsh Shell,在 macOS 和一些现代 Linux 发行版中很流行)。
用户级别设置(仅对当前用户有效)
这是最常用的方式,编辑你的 Shell 配置文件。
# 如果你使用的是 Bash Shell nano ~/.bashrc # 或者 vim ~/.bashrc # 如果你使用的是 Zsh Shell nano ~/.zshrc # 或者 vim ~/.zshrc
在文件末尾添加你的 export 命令:
# .bashrc 或 .zshrc 文件内容示例
# ... (文件原有的内容) ...
# 添加自定义环境变量
export MY_DATABASE_URL="postgresql://user:password@localhost/mydb"
export FLASK_ENV="development"
# 如果你需要添加 Python 模块搜索路径
export PYTHONPATH="${PYTHONPATH}:/home/user/my_project/libs"
# 注意:${PYTHONPATH} 是为了保留 PYTHONPATH 原有的值,然后追加新的路径
保存并退出编辑器后,让配置生效:
-
方法 A(推荐):重新打开一个终端窗口,新终端会自动加载新的配置文件。
-
方法 B:在当前终端中执行以下命令来重新加载配置文件:
# 对于 Bash source ~/.bashrc # 对于 Zsh source ~/.zshrc
无论你打开多少个新终端,MY_DATABASE_URL 和 FLASK_ENV 这些变量都会自动设置好。
系统级别设置(对所有用户有效)
如果你需要为系统上的所有用户设置环境变量,可以编辑 /etc/environment 或 /etc/profile 等系统级配置文件。
警告:系统级配置需要 sudo 权限,请谨慎操作。
# 编辑 /etc/profile 文件(对所有用户登录时生效) sudo nano /etc/profile # 在文件末尾添加 export SYSTEM_WIDE_VAR="Hello from system"
生效方式:用户需要重新登录系统才能使这些更改生效。source 命令通常不适用于系统级配置文件。
在 Python 代码中动态设置(仅影响当前进程及其子进程)
你希望在 Python 程序运行时临时设置一个变量,这个变量只对当前 Python 进程及其它启动的子进程有效,而不会影响系统的环境。
使用 os.environ:
# test_set_env.py
import os
import subprocess
print("--- 修改前 ---")
print(f"MY_VAR 在修改前是: {os.environ.get('MY_VAR')}")
# 在 Python 代码中设置环境变量
os.environ['MY_VAR'] = 'Value set by Python'
print("\n--- 修改后 ---")
print(f"MY_VAR 在修改后是: {os.environ.get('MY_VAR')}")
# 启动一个子进程(比如另一个 shell)来验证
print("\n--- 启动子进程验证 ---")
subprocess.run(['echo', '子进程看到的 MY_VAR 是:', '$MY_VAR'])
# 注意:这里的 $MY_VAR 不会被 shell 展开,因为 echo 的参数是直接传递的
# 正确的做法是启动一个 shell 来执行命令
subprocess.run(['bash', '-c', 'echo "子进程看到的 MY_VAR 是: $MY_VAR"'])
运行结果:
--- 修改前 ---
MY_VAR 在修改前是: None
--- 修改后 ---
MY_VAR 在修改后是: Value set by Python
--- 启动子进程验证 ---
子进程看到的 MY_VAR 是: $MY_VAR
子进程看到的 MY_VAR 是: Value set by Python
从结果可以看出,通过 os.environ 设置的变量,不仅可以在当前 Python 脚本中访问,还可以传递给它启动的子进程(如 bash)。
最佳实践与总结
| 场景 | 推荐方法 | 命令/文件 | 生效范围 | 持久性 |
|---|---|---|---|---|
| 临时调试 | 直接在终端设置 | export VAR_NAME='value' |
当前终端及其子进程 | 会话级别,关闭终端失效 |
| 个人长期使用 | 编辑用户配置文件 | ~/.bashrc 或 ~/.zshrc |
当前用户的所有终端会话 | 永久,需 source 或重启终端 |
| 系统通用配置 | 编辑系统配置文件 | /etc/profile 或 /etc/environment |
系统所有用户 | 永久,需用户重新登录 |
| 程序内部动态设置 | 在 Python 代码中设置 | os.environ['VAR'] = 'value' |
当前 Python 进程及其子进程 | 仅在程序运行期间有效 |
重要提示:
- 大小写敏感:环境变量名通常是全大写(如
API_KEY),但这不是强制规定,只是惯例。 - 安全:切勿将密码、API 密钥等敏感信息硬编码在代码或 Git 仓库中,应通过环境变量或配置文件来管理,并确保配置文件不被提交到版本控制系统(在
.gitignore中添加.env文件)。 PYTHONPATHvspip:pip install用于安装包到 Python 的标准库路径。PYTHONPATH用于告诉 Python 解释器在标准库路径之外去寻找模块,当你有自己开发的、尚未安装的本地模块需要导入时,可以使用PYTHONPATH。
- 使用
.env文件:对于复杂的项目,管理所有环境变量会很麻烦,一个流行的做法是使用.env文件来存储变量,然后使用python-dotenv库在 Python 启动时自动加载它们,这既保持了代码和配置的分离,又比直接修改系统环境变量更灵活、更安全。
