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.

Artigos relacionados