Kodėl os.system("unset http_proxy") nieko nekeičia
Pašalinkite proxy kintamąjį iš tinkamo Python proceso arba perduokite valdomą aplinką pavaldžiai komandai.
Šie iškvietimai sukuria du atskirus shell procesus:
os.system('unset http_proxy')
os.system('curl https://example.com/')
Pirmasis shell pašalina kintamąjį iš savo aplinkos ir baigia darbą. Python procese vis dar yra pradinė reikšmė. Antrasis shell vėl ją paveldi.
Perduokite vaikui aplinką, kurios norėjote
Kai tik viena komanda turi veikti be paveldėtų proxy kintamųjų, nukopijuokite Python aplinką ir perduokite kopiją vaikui:
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)
Aiškus tuščias curl proxy nustatymas taip pat nepaiso proxy pasirinkimo iš curl konfigūracijos. Aplinkos kopija išsaugo kitas reikšmes, kurių komandai gali prireikti. Perdavus tuščią aplinką, gali būti pašalinti vykdomųjų failų paieškos keliai ir nesusijusi programos konfigūracija.
Tolesniems veiksmams pačiame Python procese sąmoningai pakeiskite os.environ. Tai paveikia, ką paveldės naujai sukuriami vaikai; tai neperrašo tėvinio terminalo aplinkos ir nebūtinai iš naujo sukonfigūruoja HTTP klientus, kurie jau užfiksavo savo nustatymus.
subprocess API dokumentuoja env argumentą, o os.environ aprašo Python proceso aplinką. Šios apimtys yra priežastis, kodėl shell komanda gali pranešti apie sėkmę, nors kitas užklausimas vis dar naudoja seną proxy.
Galiausiai patikrinkite klientą, kurį iš tikrųjų paleidžiate. Aplinkos kintamieji yra vienas konfigūracijos įvesties šaltinis. Aiškus proxy parametras arba pačios programos konfigūracija gali toliau rinktis proxy, kai tų kintamųjų jau nebėra.