As seguintes chamadas crean dous procesos de shell separados:

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

O primeiro shell elimina unha variable do seu propio contorno e remata. O proceso de Python aínda ten o valor orixinal. O segundo shell hérdano de novo.

Dálle ao fillo o contorno que pretendías

Cando só un comando debe executarse sen variables de proxy herdadas, copia o contorno de Python e pasa a copia ao fillo:

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)

A configuración explícita de proxy baleira de curl tamén anula a selección de proxy da propia configuración de curl. A copia do contorno conserva outros valores que o comando poida necesitar. Pasar un contorno baleiro no seu lugar pode eliminar rutas de busca de executables e configuración de aplicación non relacionada.

Para operacións posteriores no propio proceso de Python, cambia os.environ deliberadamente. Iso afecta o que herdan os fillos recentemente creados; non reescribe o contorno do terminal pai nin necesariamente reconfigura clientes HTTP que xa capturaron a súa configuración.

A API de subprocess documenta o argumento env, e os.environ describe o contorno de proceso de Python. Estes ámbitos son a razón pola que un comando de shell pode informar éxito mentres a seguinte solicitude aínda usa o proxy antigo.

Por último, comproba o cliente que realmente executas. As variables de contorno son unha entrada de configuración. Unha opción de proxy explícita ou a propia configuración dunha aplicación poden seguir elixindo un proxy despois de que esas variables desaparezan.

Artigos relacionados