os.system("unset http_proxy")가 아무것도 바꾸지 않는 이유
프록시 변수를 올바른 Python 프로세스에서 제거하거나 자식 명령에 제어된 환경을 제공하세요.
다음 호출은 두 개의 별도 셸 프로세스를 만듭니다:
os.system('unset http_proxy')
os.system('curl https://example.com/')
첫 번째 셸은 자신의 환경에서 변수를 제거하고 종료합니다. Python 프로세스에는 여전히 원래 값이 있습니다. 두 번째 셸은 그것을 다시 상속합니다.
자식에게 의도한 환경을 주기
상속된 프록시 변수 없이 명령 하나만 실행해야 할 때는 Python의 환경을 복사하여 그 복사본을 자식에게 전달하세요:
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)
curl의 명시적 빈 프록시 설정은 curl 자체 구성의 프록시 선택도 재정의합니다. 환경 복사본은 명령에 필요할 수 있는 다른 값을 보존합니다. 대신 빈 환경을 전달하면 실행 파일 검색 경로와 관련 없는 애플리케이션 구성이 제거될 수 있습니다.
Python 프로세스 자체에서 이후 작업을 하려면 os.environ를 의도적으로 변경하세요. 이는 새로 생성된 자식이 상속하는 것에 영향을 주지만 부모 터미널의 환경을 다시 쓰지 않으며 이미 설정을 캡처한 HTTP 클라이언트를 반드시 다시 구성하지도 않습니다.
subprocess API는 env 인수를 문서화하며, os.environ은 Python의 프로세스 환경을 설명합니다. 이러한 범위 때문에 셸 명령이 성공을 보고해도 다음 요청은 여전히 이전 프록시를 사용합니다.
마지막으로 실제로 실행 중인 클라이언트를 확인하세요. 환경 변수는 하나의 구성 입력입니다. 명시적 프록시 옵션이나 애플리케이션 자체 구성은 해당 변수가 사라진 후에도 프록시를 계속 선택할 수 있습니다.