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 для другой работы в процессе Python.
Присваивание напрямую в os.environ тоже осмысленно: оно обновляет среду процесса Python и может влиять на дочерние процессы, запущенные позже. Оно не обновляет оболочку, запустившую Python, несвязанное приложение или уже работающий дочерний процесс.
Если цель — изменить будущие команды в интерактивной оболочке, сделайте это изменение в оболочке. Если только одному запущенному инструменту нужен другой маршрут, держите его среду рядом с вызовом subprocess, как показано.