Python subprocess.run:让单个子进程使用自己的代理环境
当单个子命令需要代理时,把复制出来的环境传给 subprocess.run,而不改动 Python 自身环境以供其他工作使用。
Python 程序可以让单个子命令拥有自己的代理环境。复制继承来的值,修改副本,再把它传给 subprocess.run:
import os
import subprocess
child_env = os.environ.copy()
child_env["https_proxy"] = "http://proxy.example:8080"
subprocess.run(
["curl", "--head", "https://www.example.com/"],
env=child_env,
check=True,
timeout=30,
)示例假设 curl 已经可用。它的 HTTPS 请求可以使用支持所需隧道的 HTTP 代理。在不配置代理凭据的情况下检查这个公开站点时,可以用 HTTP 代理列表中的一个候选地址替换示例中的端点。子进程仍然会收到复制环境的其余部分,包括任何适用的绕过设置。
传入 env 只让这次调用使用该环境。副本避免了为进程中的其他工作改动 os.environ。
直接给 os.environ 赋值也有意义:它会更新 Python 的进程环境,并可能影响之后启动的子进程。它不会更新启动 Python 的那个 shell,也不会影响无关的应用程序或已经在运行的子进程。
如果目的是改变交互式 shell 中后续的命令,就在 shell 里改。如果只有启动的某个工具需要走不同路径,就照示例那样把它的环境放在 subprocess 调用旁边。