直接调用 os.environ.items() 可获取当前 Python 进程启动时继承的全部环境变量键值对,返回类字典视图对象,遍历时实时调用系统 getenv(),不自动同步后续系统修改。

如何用 os.environ.items() 获取所有环境变量
直接调用 os.environ.items() 就能拿到当前进程可见的全部环境变量(键值对形式),它返回的是一个类似字典视图的对象,可遍历、可转 dict、也可直接用于循环打印。
注意:这不是“系统全局变量”的快照,而是 Python 进程启动时继承的那一份 —— 后续系统级修改(比如在另一个终端里执行 export FOO=bar)不会自动同步进来。
-
os.environ是一个os._Environ实例,行为接近dict,但底层是实时读取/写入操作系统环境块 - 调用
.items()不会触发复制,但遍历时每次访问值都会做一次getenv()系统调用(CPython 实现细节,一般不用在意) - Windows 下键名默认不区分大小写(
PATH和path可能指向同一值),但os.environ里仍以原始大小写存储,遍历时需留意
遍历打印时为什么有些变量值为空或显示为 None
极少情况下,你会看到某个 key 对应的 value 是空字符串或 None,这通常不是 bug,而是环境本身如此 —— 比如某些容器或 CI 环境会预设空值占位符。
更常见的是误把键名拼错后去查,结果得到 os.environ.get("NONEXISTENT") 的默认返回值(None),但 .items() 不会包含这种键。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 检查是否在遍历时做了额外的
.get()调用,混淆了.items()和.get()的语义 - 确认终端或 IDE 启动方式:GUI 应用(如 PyCharm 图形界面启动)可能继承不到 shell 中设置的变量,建议从终端运行脚本验证
- Linux/macOS 下可用
print('\n'.join(f'{k}={v}' for k, v in os.environ.items()))快速比对 shell 中的env输出
想过滤特定前缀的变量(比如只看 HTTP_ 或 PYTHON)怎么办
直接在 for k, v in os.environ.items() 循环里加 if k.startswith(...) 判断最简单,不需要先转成 dict 或列表。
如果要多次复用过滤逻辑,可以封装成生成器函数避免一次性加载全部到内存(虽然环境变量数量极少,这点几乎无意义):
def env_with_prefix(prefix):
for k, v in os.environ.items():
if k.startswith(prefix):
yield k, v
<h1>用法</h1><p>for k, v in env_with_prefix("PATH"):
print(f"{k}: {v}")-
os.environ本身不提供原生过滤方法,别试图找.filter()这种不存在的接口 - 避免写
[x for x in os.environ.items() if x[0].startswith(...)]—— 除非你明确需要列表,否则生成器更轻量 - 注意大小写:Windows 上
os.environ.keys()返回的可能是混合大小写,startswith("path")可能不匹配"PATH",建议统一用.upper().startswith(...)处理
修改 os.environ 会影响父进程或系统吗
完全不会。对 os.environ 的增删改只作用于当前 Python 进程及其后续 subprocess 子进程,父 shell 或其他正在运行的程序完全无感。
这是个常被误解的点:很多人以为 os.environ["FOO"] = "bar" 能让终端里下一条命令也读到 FOO,其实不能。
- 子进程(如
subprocess.run(["env"]))会继承修改后的环境,这是唯一“生效”场景 - 想让 shell 知道新变量?必须在 shell 里执行
export FOO=bar,Python 无法绕过进程隔离做到这点 - 临时覆盖某个变量给子命令用,推荐用
subprocess.run(..., env={**os.environ, "FOO": "bar"}),而不是先改os.environ再跑
实际用的时候,最易忽略的是环境变量的继承时机 —— 它冻结在 Python 解释器启动那一刻,之后无论你在系统里怎么 export,只要不重启 Python 进程,os.environ.items() 就不会变。

















