ZetCode

Python os.environ 函数

上次修改时间:2025 年 4 月 11 日

这篇综合指南探索了 Python 的 os.environ 映射,它提供了对环境变量的访问。我们将涵盖读取、修改以及在 Python 应用程序中使用环境变量的实际示例。

基本定义

os.environ 是一个类似字典的对象,表示当前进程的环境变量。 它在 Python 启动时被填充。

环境变量是存储在操作系统中的名称-值对。 它们通常用于配置和将信息传递给进程。

访问环境变量

可以像字典项一样访问环境变量。 这个例子展示了如何读取常见的系统变量并处理丢失的变量。

access_variables.py
import os

# Access common environment variables
print(f"User's home directory: {os.environ['HOME']}")
print(f"Current PATH: {os.environ['PATH']}")

# Safe access with get() for potentially missing variables
python_path = os.environ.get('PYTHONPATH', 'Not set')
print(f"PYTHONPATH: {python_path}")

# Handle missing variables with try/except
try:
    print(f"Non-existent var: {os.environ['NON_EXISTENT']}")
except KeyError:
    print("Variable NON_EXISTENT not found")

第一部分直接访问应该存在的变量。 第二部分使用 get() 进行安全访问。 第三部分演示了异常处理。

始终考虑环境变量在生产代码中可能丢失或为空。

修改环境变量

环境变量可以在运行时修改,但更改只会影响当前进程及其子进程。 此示例演示了修改。

modify_variables.py
import os

# Print original value
print(f"Original PATH: {os.environ.get('PATH', '')[:50]}...")

# Add a directory to PATH
new_path = "/usr/local/custom/bin"
os.environ['PATH'] = f"{new_path}:{os.environ['PATH']}"
print(f"Modified PATH: {os.environ.get('PATH', '')[:50]}...")

# Set a new variable
os.environ['CUSTOM_VAR'] = "special_value"
print(f"CUSTOM_VAR: {os.environ['CUSTOM_VAR']}")

# Delete a variable
if 'TEMP_VAR' in os.environ:
    del os.environ['TEMP_VAR']
    print("Deleted TEMP_VAR")

这显示了如何修改现有变量、创建新变量和删除变量。 更改仅在当前 Python 进程中可见。

修改后的环境变量将被从此 Python 进程产生的任何子进程继承。

检查变量是否存在

您可以在访问环境变量之前检查它是否存在。 此示例演示了几种检查存在性的方法。

check_existence.py
import os

# Method 1: Using 'in' operator
if 'HOME' in os.environ:
    print("HOME variable exists")

# Method 2: Using get() with default
lang = os.environ.get('LANG', 'en_US.UTF-8')
print(f"Language: {lang}")

# Method 3: Using os.getenv()
editor = os.getenv('EDITOR', 'vim')
print(f"Default editor: {editor}")

# Method 4: Checking for None
timezone = os.getenv('TZ')
if timezone is not None:
    print(f"Timezone: {timezone}")
else:
    print("Timezone not set")

第一种方法使用直接的字典式检查。 第二种和第三种使用带有默认值的 get() 和 getenv()。 第四种显式检查 None。

选择最适合您的错误处理策略和代码风格的方法。

环境变量和子进程

在 Python 中修改的环境变量会传递给子进程。 此示例展示了如何控制子进程的环境。

subprocess_env.py
import os
import subprocess

# Original environment
print(f"Original ENV_VAR: {os.getenv('ENV_VAR', 'Not set')}")

# Modify environment
os.environ['ENV_VAR'] = 'parent_value'

# Spawn subprocess with inherited environment
subprocess.call(['python3', '-c', 'import os; print(f"Child ENV_VAR: {os.getenv(\'ENV_VAR\')}")'])

# Spawn subprocess with custom environment
custom_env = os.environ.copy()
custom_env['ENV_VAR'] = 'custom_value'
subprocess.call(['python3', '-c', 'import os; print(f"Custom Child ENV_VAR: {os.getenv(\'ENV_VAR\')}")'], 
                env=custom_env)

第一个子进程继承了修改后的环境。 第二个使用自定义环境字典。 原始环境保持不变。

当使用 subprocess.Popen 或类似命令时,您可以根据需要传递完整的自定义环境字典。

使用 os.environb

对于二进制环境变量处理,Python 提供了 os.environb。 这在处理非 UTF-8 环境变量时非常有用。

environ_binary.py
import os

# Set a binary environment variable
os.environb[b'BINARY_VAR'] = b'special_value\xff'

# Access through environb
print(f"Binary var: {os.environb[b'BINARY_VAR']}")

# Convert between str and bytes
str_var = "unicode_text"
os.environb[b'BYTES_VAR'] = str_var.encode('utf-8')
print(f"Decoded var: {os.environb[b'BYTES_VAR'].decode('utf-8')}")

# Check existence in environb
if b'PATH' in os.environb:
    print(f"PATH exists in binary form")

此示例显示了如何使用环境变量作为字节而不是字符串。 environb 对象行为类似于 environ,但对键/值使用字节。

当处理非文本环境变量或需要精确的字节表示时,请使用 environb。

安全注意事项

环境变量可能包含敏感数据。 此示例演示了环境变量的安全处理实践。

security.py
import os
from getpass import getpass

# Securely get sensitive data
if 'DB_PASSWORD' not in os.environ:
    os.environ['DB_PASSWORD'] = getpass("Enter database password: ")

# Never print sensitive environment variables
print("Database configuration loaded")
print(f"DB_HOST: {os.getenv('DB_HOST')}")
# print(f"DB_PASSWORD: {os.getenv('DB_PASSWORD')}")  # Dangerous!

# Secure alternative for subprocesses
safe_env = {
    'DB_HOST': os.getenv('DB_HOST'),
    'DB_USER': os.getenv('DB_USER')
}
# subprocess.run(..., env=safe_env)

# Clearing sensitive data after use
os.environ.pop('DB_PASSWORD', None)

这显示了安全实践:交互式输入密钥、避免记录敏感数据、为子进程创建安全环境以及清理。

始终将环境变量视为可能在进程列表和日志中可见。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程