Por que os.system("unset http_proxy") non cambia nada
Elimina unha variable de proxy do proceso de Python correcto ou fornece un contorno controlado a un comando fillo.
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.