Las siguientes llamadas crean dos procesos de shell separados:

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

El primer shell elimina una variable de su propio entorno y termina. El proceso de Python conserva el valor original. El segundo shell lo hereda de nuevo.

Dé al hijo el entorno que pretendía

Cuando solo un comando debe ejecutarse sin variables de proxy heredadas, copie el entorno de Python y pase la copia al hijo:

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)

El ajuste explícito de proxy vacío de curl también anula la selección de proxy de la propia configuración de curl. La copia del entorno conserva otros valores que el comando pueda necesitar. Pasar un entorno vacío en su lugar puede eliminar rutas de búsqueda de ejecutables y configuración de aplicación no relacionada.

Para operaciones posteriores en el propio proceso de Python, cambie os.environ deliberadamente. Eso afecta lo que heredan los hijos recién creados; no reescribe el entorno del terminal padre ni necesariamente reconfigura clientes HTTP que ya capturaron su configuración.

La API de subprocess documenta el argumento env, y os.environ describe el entorno de proceso de Python. Estos ámbitos son la razón por la que un comando de shell puede informar éxito mientras la siguiente solicitud sigue usando el proxy antiguo.

Por último, compruebe el cliente que realmente ejecuta. Las variables de entorno son una entrada de configuración. Una opción de proxy explícita o la propia configuración de una aplicación pueden seguir eligiendo un proxy después de que esas variables desaparezcan.

Artículos relacionados