Miért nem változtat semmit az os.system("unset http_proxy")
Távolítsa el a proxy változót a megfelelő Python-folyamatból, vagy adjon szabályozott környezetet egy gyermekparancsnak.
A következő hívások két külön shell-folyamatot hoznak létre:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Az első shell eltávolít egy változót a saját környezetéből, majd kilép. A Python-folyamatban továbbra is ott van az eredeti érték. A második shell újra örökli.
Adja a gyermeknek a szándékolt környezetet
Ha csak egy parancsnak kell örökölt proxy változók nélkül futnia, másolja le a Python környezetét, és adja át a másolatot a gyermeknek:
import os
import subprocess
env = os.environ.copy()
for name in ('http_proxy', 'https_proxy', 'all_proxy',
'HTTP_PROXY', 'HTTPS_PROXY', 'ALL_PROXY'):
env.pop(name, None)
subprocess.run(['curl', '--proxy', '', 'https://example.com/'],
env=env, check=True)
A curl kifejezett üres proxy-beállítása felülírja a curl saját konfigurációjából származó proxyválasztást is. A környezet másolata megőrzi azokat az egyéb értékeket, amelyekre a parancsnak szüksége lehet. Ha ehelyett üres környezetet ad át, az eltávolíthatja a végrehajtható fájlok keresési útvonalait és a nem kapcsolódó alkalmazáskonfigurációt.
A Python-folyamaton belüli későbbi műveletekhez szándékosan módosítsa a os.environ elemet. Ez befolyásolja, hogy az újonnan létrehozott gyermekek mit örökölnek; nem írja felül a szülő terminál környezetét, és nem feltétlenül konfigurálja újra azokat a HTTP-klienseket, amelyek már rögzítették a beállításaikat.
A subprocess API dokumentálja a env argumentumot, és az os.environ a Python folyamatkörnyezetét írja le. Ezek a hatókörök az oka annak, hogy egy shell-parancs sikert jelenthet, miközben a következő kérés még mindig a régi proxyt használja.
Végül ellenőrizze a ténylegesen futtatott klienst. A környezeti változók egyetlen konfigurációs bemenet. Egy kifejezett proxy-beállítás vagy egy alkalmazás saját konfigurációja továbbra is választhat proxyt, miután ezek a változók eltűntek.