개발 및 AI · Clash 기술 블로그

pip 또는 Conda 다운로드 시간 초과 해결 방법: Python 환경에서 Clash 프록시를 올바르게 사용하기

pip, Conda 및 git+https는 서로 다른 프록시 설정을 읽습니다. 새 터미널에서 임시 테스트를 한 번 실행해 실제 네트워크 문제인지 확인한 뒤 구성을 저장할 위치를 결정하세요.

  • pip
  • Conda
  • Python
  • 다운로드 시간 초과
이 글의 목차

pip 또는 Conda 시간 초과 시 실제 다운로드 주체부터 확인

브라우저에서 PyPI가 열린다고 터미널의 pip, Conda 또는 Git이 Clash를 사용한다는 뜻은 아닙니다. 실패 명령이 접근하는 도메인과 실행 프로그램부터 확인하고 현재 터미널의 임시 프록시로 비교하세요. 임시 테스트에 성공한 뒤에만 pip, .condarc 또는 프로젝트 가상 환경에 기록할지 결정하고 해당 취소 명령도 보존합니다.

명령 실행 주체부터 확인

명령 또는 오류실제 다운로드 도구확인할 구성
python -m pip installpip / Python HTTP 라이브러리pip config debug, 환경 변수와 --proxy
conda install / createCondaconda config --show-sources、~/.condarc
git+https://...Gitgit config --show-origin --get-regexp http.*proxy
컴파일 단계에서 리소스를 다시 다운로드패키지 자체 빌드 스크립트상세 로그의 실제 URL

새 터미널에서 임시 테스트 한 번 먼저 수행

macOS / Linux 현재 터미널, CLASH_PORT는 실제 mixed-port에 맞게 수정
CLASH_PORT=7890
export HTTP_PROXY="http://127.0.0.1:$CLASH_PORT"
export HTTPS_PROXY="http://127.0.0.1:$CLASH_PORT"
export NO_PROXY=localhost,127.0.0.1,::1

python -m pip install --dry-run packaging
conda search python

unset HTTP_PROXY HTTPS_PROXY NO_PROXY
Windows PowerShell 현재 창, 7890은 실제 mixed-port에 맞게 수정
$ClashPort = 7890
$env:HTTP_PROXY = "http://127.0.0.1:$ClashPort"
$env:HTTPS_PROXY = "http://127.0.0.1:$ClashPort"
$env:NO_PROXY = "localhost,127.0.0.1,::1"

py -m pip install --dry-run packaging

Remove-Item Env:HTTP_PROXY, Env:HTTPS_PROXY, Env:NO_PROXY

포트는 Clash의 실제 mixed-port로 바꾸세요. 테스트할 때 클라이언트 연결 페이지를 열고 PyPI 또는 channel 요청이 나타나 예상 노드에 일치해야 명령이 프록시에 들어간 것입니다. 브라우저에서 pypi.org에 접근할 수 있다는 사실로 이 단계를 대신할 수 없습니다.

pip만 장기간 사용해야 할 때 pip 구성에 기록

출처 확인, 임시 사용과 취소
python -m pip config debug
python -m pip config list -v

# 单次命令,官方支持 scheme://[user:password@]host:port
python -m pip install --proxy http://127.0.0.1:7890 requests

# 若曾写入用户配置,查看后再删除
python -m pip config unset global.proxy
현재 가상 환경에만 사용하고 별도로 취소할 수 있음
# 先激活项目自己的 venv,再执行
python -m pip config --site set global.proxy http://127.0.0.1:7890
python -m pip config --site list

# 项目不再需要代理时
python -m pip config --site unset global.proxy

pip 구성은 전역, 사용자, 가상 환경과 PIP_CONFIG_FILE에서 올 수 있습니다. config debug는 파일 경로를 나열하므로 처음 찾은 pip.conf만 편집하지 마세요.

--site는 현재 가상 환경에 기록하므로 로컬 프로젝트에서만 사용하기에 적합합니다. 하지만 .venv는 반드시 .gitignore에 남겨야 하며 requirements.txt와 pyproject.toml에도 개인 프록시를 기록하면 안 됩니다.

사용자 index-url을 사용한다면 어느 도메인에서 시간 초과가 발생하는지도 명확히 기록하세요. 인덱스 페이지는 정상인데 wheel 파일 다운로드가 실패한다면 파일 CDN 또는 인증서 경로가 다를 수 있습니다.

Conda의 proxy_servers는 .condarc에 넣고 channel 확인

pip 테스트는 성공하지만 Conda에서 계속 시간 초과가 날 때만 .condarc를 확인합니다. Conda는 channel의 repodata를 먼저 받은 뒤 패키지를 다운로드하므로 상세 출력에서 마지막으로 실패한 channel을 확인해야 합니다.

~/.condarc 예시
proxy_servers:
  http: http://127.0.0.1:7890
  https: http://127.0.0.1:7890

ssl_verify: true
출처 확인 및 제거
conda config --show-sources
conda config --show proxy_servers ssl_verify channels

# 不再需要时删除整个代理映射
conda config --remove-key proxy_servers

Conda는 channel의 repodata를 먼저 받고 구체적인 패키지를 다운로드합니다. 제삼자 channel 하나가 작동하지 않으면 프록시 설정이 완전히 올바르더라도 404 또는 시간 초과가 발생할 수 있습니다. 상세 출력에서 마지막으로 접근한 channel을 확인하고 defaults, conda-forge와 개인 미러를 모두 함께 다시 작성하지 마세요.

CERTIFICATE_VERIFY_FAILED를 trusted-host 또는 ssl_verify: false로 덮어 두지 마세요

시스템 시간, 인덱스 도메인과 기업 HTTPS 검사가 있는지 확인합니다. 조직에서 CA 파일을 제공하면 pip는 --cert 또는 PIP_CERT를 사용할 수 있고 Conda는 ssl_verify가 CA 파일을 가리키게 할 수 있습니다.

Conda 23.9+와 Python 3.10+에서는 운영체제 인증서 저장소를 사용하는 ssl_verify: truststore도 지원합니다.

ssl_verify: false는 이후 모든 Conda 요청에서 인증서 검증을 건너뛰게 하므로 장기 구성으로 적합하지 않습니다. 가정용 네트워크에서 갑자기 알 수 없는 CA가 나타나면 웹페이지에서 권장하는 루트 인증서를 설치하지 말고 보안 소프트웨어 또는 프록시 노드를 확인하세요.

관리 기기 예시, 경로는 관리자가 제공
# pip 单次命令
python -m pip install --cert /path/to/company-ca.pem requests

# .condarc 二选一
ssl_verify: /path/to/company-ca.pem
# ssl_verify: truststore

의존성에 git+https가 있다면 Git 확인으로 돌아가기

pip는 git+https 의존성을 처리할 때 Git을 호출합니다. 프로젝트 외부에서 해당 저장소에 git ls-remote를 먼저 실행하고 git config --show-origin으로 기존 프록시를 찾으세요. 인증이 필요한 저장소는 인증 정보 관리자 또는 SSH key를 사용하고 token을 requirements에 기록하지 않습니다.

PEP 517 빌드 격리는 임시 환경을 만들고 build backend를 다운로드할 수도 있습니다. -vvv로 상세 로그를 저장하고 실제 실패 URL을 확인한 뒤 pip, Git 또는 패키지 빌드 스크립트 중 무엇이 원인인지 판단하세요.

바로 실행할 수 있는 공개 예시, 이후 오류가 난 저장소와 패키지 이름으로 교체
REPO_URL='https://github.com/pallets/flask.git'
PACKAGE_NAME='packaging'

git config --show-origin --get-regexp 'http..*.proxy|http.proxy' || true
git ls-remote "$REPO_URL"
python -m pip install -vvv "$PACKAGE_NAME"

정리 후 새 터미널을 열어 검증

임시 프록시와 영구 구성을 모두 테스트한 뒤 현재 터미널을 닫고 새로 여세요. 이전 환경 변수는 기존 창에만 남기 때문에 새 창에서 장기 구성이 실제로 어디에 기록되었는지 가장 명확히 알 수 있습니다.

완료 조건

  • pip config debug에 기존 proxy가 더 이상 표시되지 않음
  • conda config --show-sources에 잘못된 proxy_servers가 없음
  • 새 터미널의 HTTP_PROXY, HTTPS_PROXY와 ALL_PROXY가 모두 예상과 일치함
  • pip 소형 패키지, Conda repodata와 git+https 의존성을 각각 테스트함
  • Clash를 끈 뒤 프록시를 설정하지 않은 Python 명령이 기존 127.0.0.1 포트를 계속 가리키지 않음
  • 인증서 검증이 켜진 상태로 유지됨

참고 자료