Perché os.system("unset http_proxy") non cambia nulla
Rimuovi una variabile proxy dal processo Python corretto oppure fornisci un ambiente controllato a un comando figlio.
Le chiamate seguenti creano due processi shell separati:
os.system('unset http_proxy')
os.system('curl https://example.com/')
La prima shell rimuove una variabile dal proprio ambiente ed esce. Il processo Python ha ancora il valore originale. La seconda shell lo eredita di nuovo.
Dai al figlio l'ambiente che intendevi
Quando solo un comando deve essere eseguito senza variabili proxy ereditate, copia l'ambiente di Python e passa la copia al figlio:
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)
L'impostazione esplicita di proxy vuoto di curl sovrascrive anche la selezione del proxy dalla configurazione propria di curl. La copia dell'ambiente conserva altri valori di cui il comando può avere bisogno. Passare invece un ambiente vuoto può rimuovere percorsi di ricerca degli eseguibili e configurazioni applicative non correlate.
Per le operazioni successive nel processo Python stesso, modifica os.environ deliberatamente. Ciò influisce su ciò che ereditano i figli appena creati; non riscrive l'ambiente del terminale padre né necessariamente riconfigura i client HTTP che hanno già acquisito le proprie impostazioni.
L'API subprocess documenta l'argomento env, e os.environ descrive l'ambiente di processo di Python. Questi ambiti sono il motivo per cui un comando shell può segnalare successo mentre la richiesta successiva usa ancora il vecchio proxy.
Infine, controlla il client che stai effettivamente eseguendo. Le variabili d'ambiente sono un solo input di configurazione. Un'opzione proxy esplicita o la configurazione propria di un'applicazione possono continuare a scegliere un proxy dopo che quelle variabili sono scomparse.