Por que os.system("unset http_proxy") não muda nada
Remova uma variável de proxy do processo Python correto ou forneça um ambiente controlado a um comando filho.
As chamadas a seguir criam dois processos de shell separados:
os.system('unset http_proxy')
os.system('curl https://example.com/')
O primeiro shell remove uma variável do próprio ambiente e encerra. O processo Python ainda tem o valor original. O segundo shell o herda novamente.
Dê ao filho o ambiente que você pretendia
Quando apenas um comando deve rodar sem variáveis de proxy herdadas, copie o ambiente do Python e passe a cópia ao filho:
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 configuração explícita de proxy vazio no curl também sobrepõe a escolha de proxy da própria configuração do curl. A cópia do ambiente preserva outros valores de que o comando pode precisar. Passar um ambiente vazio em vez disso pode remover caminhos de busca de executáveis e configuração de aplicação não relacionada.
Para operações subsequentes no próprio processo Python, altere os.environ de propósito. Isso afeta o que os filhos recém-criados herdam; não reescreve o ambiente do terminal pai nem necessariamente reconfigura clientes HTTP que já capturaram suas configurações.
A subprocess API documenta o argumento env, e os.environ descreve o ambiente de processo do Python. Esses escopos são a razão pela qual um comando de shell pode relatar sucesso enquanto a próxima requisição ainda usa o proxy antigo.
Por fim, verifique o cliente que você realmente executa. Variáveis de ambiente são apenas uma entrada de configuração. Uma opção de proxy explícita ou a configuração própria da aplicação pode continuar escolhendo um proxy depois que essas variáveis desaparecem.