杰瑞科技汇

Python如何设置Linux环境变量?

核心概念:进程 vs. 系统环境变量

要理解一个关键点:

Python如何设置Linux环境变量?-图1
(图片来源网络,侵删)
  • 进程环境变量:每个正在运行的程序(进程)都有自己的环境变量空间,当一个进程(比如你的 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.")

为子进程设置环境变量

当你使用 ossubprocess 模块启动一个新进程时,默认情况下,子进程会继承父进程(你的 Python 脚本)的所有环境变量。

Python如何设置Linux环境变量?-图2
(图片来源网络,侵删)
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 对系统所有用户永久生效,通常需重启。

最佳实践建议

  1. 优先使用 os.environ:如果你的变量只服务于你的 Python 应用及其调用的子程序,这是最安全、最直接的方式。
  2. 避免从 Python 直接修改系统文件:除非你是在编写一个系统配置工具,否则让用户手动修改配置文件是更清晰、更安全的做法。
  3. 使用 .env 文件:对于应用开发,一个非常流行的模式是使用 .env 文件来存储配置和密钥,然后在 Python 启动时加载它,这既避免了硬编码,也无需修改系统环境变量,可以使用 python-dotenv 库来实现。
分享:
扫描分享到社交APP
上一篇
下一篇