Šie izsaukumi izveido divus atsevišķus shell procesus:

os.system('unset http_proxy')
os.system('curl https://example.com/')

Pirmais shell noņem mainīgo no savas vides un beidz darbu. Python procesā joprojām ir sākotnējā vērtība. Otrais shell to atkal manto.

Dodiet bērnam vidi, ko bijāt iecerējis

Ja tikai vienai komandai jādarbojas bez mantotajiem proxy mainīgajiem, nokopējiet Python vidi un nododiet kopiju bērnam:

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)

Skaidri tukšais curl proxy iestatījums arī pārspēj proxy izvēli no curl paša konfigurācijas. Vides kopija saglabā citas vērtības, kas komandai var būt vajadzīgas. Tukšas vides nodošana var izņemt izpildāmo failu meklēšanas ceļus un nesaistītu lietotnes konfigurāciju.

Turpmākām darbībām pašā Python procesā apzināti mainiet os.environ. Tas ietekmē to, ko mantos jaunizveidotie bērni; tas nepārraksta vecāktermināļa vidi un ne vienmēr pārkonfigurē HTTP klientus, kas jau ir fiksējuši savus iestatījumus.

subprocess API dokumentē env argumentu, un os.environ apraksta Python procesa vidi. Šīs tvēruma atšķirības ir iemesls, kāpēc shell komanda var ziņot par panākumiem, kamēr nākamais pieprasījums joprojām izmanto veco proxy.

Visbeidzot, pārbaudiet klientu, kuru faktiski palaižat. Vides mainīgie ir viens konfigurācijas ievades avots. Skaidra proxy opcija vai pašas lietotnes konfigurācija var turpināt izvēlēties proxy pēc tam, kad šie mainīgie ir pazuduši.

Saistītie raksti