杰瑞科技汇

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

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

Linux Python环境变量如何正确设置?-图1
(图片来源网络,侵删)

核心概念:export.bashrc

在开始之前,你需要理解两个核心概念:

  1. export 命令export 是一个 Shell 命令,用于将一个 Shell 变量设置为“环境变量”,环境变量与普通 Shell 变量的区别在于,它会被传递给该 Shell 启动的所有子进程,Python 解释器就是由 Shell 启动的子进程,所以它能接收到 export 过的变量。
  2. 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 脚本中读取

Linux Python环境变量如何正确设置?-图2
(图片来源网络,侵删)

在同一个终端中创建一个 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 Python环境变量如何正确设置?-图3
(图片来源网络,侵删)

注意:根据你使用的 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_URLFLASK_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 进程及其子进程 仅在程序运行期间有效

重要提示:

  1. 大小写敏感:环境变量名通常是全大写(如 API_KEY),但这不是强制规定,只是惯例。
  2. 安全切勿将密码、API 密钥等敏感信息硬编码在代码或 Git 仓库中,应通过环境变量或配置文件来管理,并确保配置文件不被提交到版本控制系统(在 .gitignore 中添加 .env 文件)。
  3. PYTHONPATH vs pip
    • pip install 用于安装包到 Python 的标准库路径。
    • PYTHONPATH 用于告诉 Python 解释器在标准库路径之外去寻找模块,当你有自己开发的、尚未安装的本地模块需要导入时,可以使用 PYTHONPATH
  4. 使用 .env 文件:对于复杂的项目,管理所有环境变量会很麻烦,一个流行的做法是使用 .env 文件来存储变量,然后使用 python-dotenv 库在 Python 启动时自动加载它们,这既保持了代码和配置的分离,又比直接修改系统环境变量更灵活、更安全。
分享:
扫描分享到社交APP
上一篇
下一篇