杰瑞科技汇

Python/Linux环境变量如何正确设置?

什么是环境变量?

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

Python/Linux环境变量如何正确设置?-图1
(图片来源网络,侵删)
  • PATH:告诉系统在哪些目录中可以找到可执行的命令(如 python, ls, cd 等)。
  • PYTHONPATH:告诉 Python 解释器在哪些目录中可以查找模块和包。
  • 自定义变量:MY_API_KEY="123456",用于存储应用程序密钥。

在 Linux Shell 中设置环境变量

这部分主要讲解如何为你的 Shell(如 Bash, Zsh)设置环境变量。

临时设置(仅对当前终端会话有效)

当你打开一个新的终端窗口或标签页时,这些设置就会失效,这对于临时测试非常有用。

使用 export 命令

这是最直接的方法。

Python/Linux环境变量如何正确设置?-图2
(图片来源网络,侵删)
# 设置一个名为 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

操作步骤:

Python/Linux环境变量如何正确设置?-图3
(图片来源网络,侵删)
  1. 打开配置文件 使用你喜欢的文本编辑器,nanovim

    # 使用 nano 编辑 .bashrc 文件
    nano ~/.bashrc
  2. 添加 export 命令 在文件的末尾添加你的 export 命令。

    # 在 ~/.bashrc 文件末尾添加以下内容
    export MY_PERMANENT_VAR="This will last forever"
    export PATH="$PATH:/path/to/your/new/directory" # 示例:添加新路径到 PATH

    重要提示:修改 PATH 时,通常推荐使用 $PATH: 的形式,这样不会覆盖掉原有的 PATH 值,而是将新路径追加到末尾。

  3. 保存并退出

    • nano 中:按 Ctrl + X,然后按 Y,最后按 Enter
    • vim 中:按 Esc,然后输入 wq 并按 Enter
  4. 让配置立即生效 你可以关闭当前终端并重新打开一个,或者运行以下命令让配置在当前会话中立即加载。

    # 对于 Bash
    source ~/.bashrc
    # 对于 Zsh
    source ~/.zshrc
  5. 验证 现在打开一个新的终端窗口,直接输入 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 库来加载它们。

步骤:

  1. 创建 .env 文件 在你的项目根目录下创建一个名为 .env 的文件。

    # .env 文件
    DATABASE_URL="postgresql://user:password@host:port/dbname"
    API_SECRET_KEY="your-super-secret-key"
    DEBUG_MODE=True
  2. 安装 python-dotenv

    pip install python-dotenv
  3. 在 Python 代码中加载 在你的主程序(如 app.pymain.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 环境的干净。

安装和使用:

  1. 安装 direnv:

    # Ubuntu/Debian
    sudo apt-get install direnv
    # macOS (使用 Homebrew)
    brew install direnv
  2. 配置 Shell: 在 ~/.bashrc~/.zshrc 中添加:

    eval "$(direnv hook bash)"
    # 或者
    eval "$(direnv hook zsh)"
  3. 创建 .envrc 文件: 在你的项目目录下创建一个 .envrc 文件(注意,这个文件名是 .envrc,不是 .env)。

    # .envrc 文件
    export PROJECT_NAME="My Awesome Project"
    export PYTHONPATH="$PYTHONPATH:./src"
  4. 允许执行: 首次进入目录时,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)。

分享:
扫描分享到社交APP
上一篇
下一篇