Python subprocess.run: geef één kindproces zijn eigen proxy-omgeving
Geef een gekopieerde omgeving door aan subprocess.run wanneer één kindcommando een proxy nodig heeft zonder Pythons omgeving voor ander werk te wijzigen.
Een Python-programma kan één kindcommando zijn eigen proxy-omgeving geven. Kopieer de geërfde waarden, wijzig de kopie en geef die door aan 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,
)Het voorbeeld gaat ervan uit dat curl al beschikbaar is. De HTTPS-aanvraag kan een HTTP-proxy gebruiken die de vereiste tunnel ondersteunt. Voor deze controle van een openbare site zonder ingestelde proxy-inloggegevens kan een kandidaat uit de HTTP-proxylijst het eindpunt van het voorbeeld vervangen. Het kind krijgt nog steeds de rest van de gekopieerde omgeving, inclusief eventuele toepasselijke bypass-instellingen.
Door env door te geven krijgt deze aanroep die omgeving. De kopie voorkomt dat os.environ wordt gewijzigd voor ander werk in het Python-proces.
Rechtstreeks aan os.environ toewijzen is ook zinvol: het werkt de procesomgeving van Python bij en kan kinderen beïnvloeden die daarna worden gestart. Het werkt de shell die Python startte niet bij, een niet-gerelateerde toepassing niet, en een kind dat al draait niet.
Als de bedoeling is om toekomstige opdrachten in je interactieve shell te wijzigen, doe die wijziging dan in de shell. Als alleen één gestart hulpmiddel een andere route nodig heeft, houd de omgeving ervan naast de subprocess-aanroep zoals getoond.