什么是环境变量?
环境变量是操作系统中的一个对象,它包含了一个或者多个应用程序所将使用到的信息,你可以把它想象成一个全局的“配置文件”或“便利贴”,存储着系统或程序运行所需的各种路径、设置等。

PATH:告诉系统在哪些目录中可以找到可执行的命令(如python,ls,cd等)。PYTHONPATH:告诉 Python 解释器在哪些目录中可以查找模块和包。- 自定义变量:
MY_API_KEY="123456",用于存储应用程序密钥。
在 Linux Shell 中设置环境变量
这部分主要讲解如何为你的 Shell(如 Bash, Zsh)设置环境变量。
临时设置(仅对当前终端会话有效)
当你打开一个新的终端窗口或标签页时,这些设置就会失效,这对于临时测试非常有用。
使用 export 命令
这是最直接的方法。

# 设置一个名为 MY_VAR 的环境变量
export MY_VAR="Hello, World!"
# 验证是否设置成功
echo $MY_VAR
# 输出: Hello, World!
# 尝试在 Python 中使用它
python3 -c "import os; print(os.environ.get('MY_VAR'))"
# 输出: Hello, World!
直接在命令行中定义
你也可以在一行内完成定义和导出。
export NEW_VAR="This is a test" echo $NEW_VAR # 输出: This is a test
永久设置(对当前用户有效)
为了让环境变量在每次登录或打开新终端时都自动生效,你需要将 export 命令写入 Shell 的配置文件中。
- 对于 Bash Shell (最常见): 配置文件是
~/.bashrc或~/.bash_profile,通常推荐修改~/.bashrc。 - 对于 Zsh Shell (macOS 默认, Linux 也流行): 配置文件是
~/.zshrc。
操作步骤:

-
打开配置文件 使用你喜欢的文本编辑器,
nano或vim。# 使用 nano 编辑 .bashrc 文件 nano ~/.bashrc
-
添加
export命令 在文件的末尾添加你的export命令。# 在 ~/.bashrc 文件末尾添加以下内容 export MY_PERMANENT_VAR="This will last forever" export PATH="$PATH:/path/to/your/new/directory" # 示例:添加新路径到 PATH
重要提示:修改
PATH时,通常推荐使用$PATH:的形式,这样不会覆盖掉原有的PATH值,而是将新路径追加到末尾。 -
保存并退出
- 在
nano中:按Ctrl + X,然后按Y,最后按Enter。 - 在
vim中:按Esc,然后输入wq并按Enter。
- 在
-
让配置立即生效 你可以关闭当前终端并重新打开一个,或者运行以下命令让配置在当前会话中立即加载。
# 对于 Bash source ~/.bashrc # 对于 Zsh source ~/.zshrc
-
验证 现在打开一个新的终端窗口,直接输入
echo $MY_PERMANENT_VAR,应该能看到你设置的值。
在 Python 代码中设置和使用环境变量
我们需要在 Python 程序内部动态地设置或读取环境变量。
读取环境变量
Python 的 os 模块提供了操作环境变量的标准方法。
os.environ.get('VAR_NAME')(推荐): 安全地获取变量,如果变量不存在,返回None,而不会抛出错误。os.environ['VAR_NAME']: 直接获取变量,如果变量不存在,会抛出KeyError。
import os
# 推荐使用 get 方法,更安全
my_var = os.environ.get('MY_VAR')
if my_var:
print(f"从 Shell 读取到 MY_VAR: {my_var}")
else:
print("环境变量 MY_VAR 未设置")
# 尝试读取一个不存在的变量
non_existent_var = os.environ.get('NON_EXISTENT_VAR', 'default_value') # 可以提供默认值
print(f"NON_EXISTENT_VAR 的值是: {non_existent_var}")
# 使用 [] 方式读取不存在的变量会报错
# print(os.environ['NON_EXISTENT_VAR']) # 这行会引发 KeyError
设置环境变量(仅对当前 Python 进程及其子进程有效)
在 Python 中设置的环境变量,只对当前运行的 Python 脚本及其启动的子进程有效,不会影响到你的 Shell 或其他程序。
import os
import subprocess # 用于演示子进程
# 在 Python 中设置一个环境变量
os.environ['PYTHON_CREATED_VAR'] = 'This was set in Python'
print(f"在当前 Python 脚本中读取: {os.environ.get('PYTHON_CREATED_VAR')}")
# 启动一个子进程(例如一个新的 shell)来验证
# 注意:这个新的 shell 会继承父进程的环境变量
subprocess.run(['echo', '$PYTHON_CREATED_VAR']) # 在 bash 中,$ 用于变量
# 实际输出会是 $PYTHON_CREATED_VAR,因为 echo 命令本身不展开变量
# 为了正确展开,应该使用 bash -c
subprocess.run(['bash', '-c', 'echo $PYTHON_CREATED_VAR'])
# 输出: This was set in Python
# 如果你退出 Python 脚本,回到 Shell,echo $PYTHON_CREATED_VAR 将会得到空
最佳实践和管理工具
手动管理 .bashrc 文件,当变量变多时会变得混乱,这里推荐两种更现代的管理方式。
使用 .env 文件 (强烈推荐)
这是目前最流行和推荐的方式,尤其适合项目开发,你可以将所有环境变量定义在一个 .env 文件中,然后使用 Python 库来加载它们。
步骤:
-
创建
.env文件 在你的项目根目录下创建一个名为.env的文件。# .env 文件 DATABASE_URL="postgresql://user:password@host:port/dbname" API_SECRET_KEY="your-super-secret-key" DEBUG_MODE=True
-
安装
python-dotenv库pip install python-dotenv
-
在 Python 代码中加载 在你的主程序(如
app.py或main.py)的开头加载.env文件。import os from dotenv import load_dotenv # 加载 .env 文件中的变量到 os.environ # .env 文件应该位于项目根目录,或者你指定路径 load_dotenv() # 现在就可以像普通环境变量一样使用了 db_url = os.environ.get('DATABASE_URL') api_key = os.environ.get('API_SECRET_KEY') debug = os.environ.get('DEBUG_MODE') print(f"数据库连接: {db_url}") print(f"API 密钥: {api_key}") print(f"调试模式: {debug}")
优点:
- 配置与代码分离:敏感信息(如密钥)不硬编码在代码里。
- 易于管理:所有配置集中在一个文件里。
- 可移植性强:可以轻松地为不同环境(开发、测试、生产)创建不同的
.env文件。
使用 direnv (高级工具)
direnv 是一个更强大的 Shell 工具,它可以根据你所在的目录自动加载或卸载环境变量,当你 cd 进入一个配置了 .envrc 文件的目录时,direnv 会自动加载其中的变量;当你离开时,会自动卸载,保持 Shell 环境的干净。
安装和使用:
-
安装
direnv:# Ubuntu/Debian sudo apt-get install direnv # macOS (使用 Homebrew) brew install direnv
-
配置 Shell: 在
~/.bashrc或~/.zshrc中添加:eval "$(direnv hook bash)" # 或者 eval "$(direnv hook zsh)"
-
创建
.envrc文件: 在你的项目目录下创建一个.envrc文件(注意,这个文件名是.envrc,不是.env)。# .envrc 文件 export PROJECT_NAME="My Awesome Project" export PYTHONPATH="$PYTHONPATH:./src"
-
允许执行: 首次进入目录时,
direnv会提示你,你需要允许它执行。cd /path/to/your/project # 会提示 direnv: error .envrc is blocked. Run `direnv allow` to approve its content. direnv allow
之后,每次进入这个目录,变量都会自动加载。
| 场景 | 方法 | 优点 | 缺点 |
|---|---|---|---|
| 临时测试 | export VAR=value |
简单快捷,无需编辑文件 | 仅当前会话有效 |
| 用户永久设置 | echo "export VAR=value" >> ~/.bashrc |
永久生效,对所有程序有效 | 需要编辑文件,全局污染 |
| 项目开发 (推荐) | .env + python-dotenv |
配置与代码分离,安全,易于管理 | 需要额外库,不直接对 Shell 生效 |
| 高级目录级管理 | direnv + .envrc |
按目录自动加载/卸载,环境干净 | 需要额外安装和配置工具 |
对于绝大多数 Python 项目开发,使用 .env 文件和 python-dotenv 库是最佳实践,对于系统级或需要 Shell 级别生效的场景,则使用 Shell 配置文件(如 ~/.bashrc)。
