Les appels suivants créent deux processus shell distincts :

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

Le premier shell retire une variable de son propre environnement puis se termine. Le processus Python possède toujours la valeur d'origine. Le second shell l'hérite de nouveau.

Donnez à l'enfant l'environnement que vous vouliez

Lorsqu'une seule commande doit s'exécuter sans variables de proxy héritées, copiez l'environnement de Python et transmettez la copie à l'enfant :

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)

Le réglage explicite de proxy vide de curl remplace aussi le choix de proxy issu de la configuration propre à curl. La copie de l'environnement préserve d'autres valeurs dont la commande peut avoir besoin. Transmettre plutôt un environnement vide peut supprimer des chemins de recherche d'exécutables et une configuration d'application sans rapport.

Pour les opérations suivantes dans le processus Python lui-même, modifiez os.environ délibérément. Cela affecte ce que les enfants nouvellement créés héritent ; cela ne réécrit pas l'environnement du terminal parent ni ne reconfigure nécessairement les clients HTTP qui ont déjà capturé leurs réglages.

L'API subprocess documente l'argument env, et os.environ décrit l'environnement de processus de Python. Ces portées sont la raison pour laquelle une commande shell peut signaler un succès alors que la requête suivante utilise encore l'ancien proxy.

Enfin, vérifiez le client que vous exécutez réellement. Les variables d'environnement sont une entrée de configuration. Une option de proxy explicite ou la configuration propre d'une application peut continuer à choisir un proxy après la disparition de ces variables.

Articles similaires