Waarom os.system("unset http_proxy") niks verander nie
Verwyder 'n proxy-veranderlike uit die regte Python-proses of gee 'n beheerde omgewing aan 'n kindopdrag.
Die volgende oproepe skep twee afsonderlike skulpprosesse:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Die eerste skulp verwyder 'n veranderlike uit sy eie omgewing en eindig. Die Python-proses het steeds die oorspronklike waarde. Die tweede skulp erf dit weer.
Gee die kind die omgewing wat jy bedoel het
Wanneer net een opdrag sonder geërfde proxy-veranderlikes moet loop, kopieer Python se omgewing en gee die kopie aan die kind:
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)
Die eksplisiete leë curl-proxy-instelling oorheers ook proxy-keuse uit curl se eie konfigurasie. Die omgewingskopie bewaar ander waardes wat die opdrag nodig het. Om eerder 'n leë omgewing deur te gee kan uitvoerbare soekpaaie en onverwante toepassingskonfigurasie verwyder.
Vir daaropvolgende bewerkings in die Python-proses self, verander os.environ doelbewus. Dit beïnvloed wat nuutgeskepte kinders erf; dit herskryf nie die ouerterminale se omgewing nie en herkonfigureer ook nie noodwendig HTTP-kliënte wat reeds hul instellings vasgelê het nie.
Die subprocess-API dokumenteer die env argument, en os.environ beskryf Python se prosesomgewing. Hierdie bestekke is die rede waarom 'n skulpopdrag sukses kan rapporteer terwyl die volgende versoek steeds die ou proxy gebruik.
Kontroleer laastens die kliënt wat jy werklik gebruik. Omgewingsveranderlikes is een konfigurasie-inset. 'n eksplisiete proxy-opsie of 'n toepassing se eie konfigurasie kan aanhou om 'n proxy te kies nadat daardie veranderlikes weg is.