개발 및 AI · Clash 기술 블로그

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

pip, Conda, git+https는 프록시 설정 출처가 다릅니다. 새 터미널의 임시 프록시로 기존 요청을 테스트하고 이름 해석, 연결, 인증서 오류로 문제를 찾으세요. 테스트가 성공하면 해당 도구에 설정을 저장하고 정리 방법도 보관하세요.

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

Python 환경의 다운로드가 브라우저 프록시를 따르는 것은 아니며 영구 설정을 반복해서 추가하면 도구가 계속 이전 포트를 사용할 수 있습니다. 새 터미널에서 원래 명령을 테스트하고 요청이 클라이언트에 도착하는지 확인한 뒤 어느 도구에 설정을 저장할지 결정하세요. 다운로드와 인증서 오류를 구분하고 테스트용 프록시를 제거할 방법도 남겨 두어야 합니다.

pip, Conda와 Git 다운로드 실패 시 프록시 설정은 어디에 있나요?

pip, Conda, Git의 실패한 명령과 도메인을 기록한 뒤 아래 표에서 설정 위치를 확인하세요. 현재 터미널의 임시 프록시로 원래 요청을 다시 시도합니다. Clash 연결 기록에 나타나고 다운로드도 성공한 뒤에만 영구 설정을 저장하고 취소 명령도 보관하세요. 브라우저에서 PyPI가 열리는 것으로 이 확인을 대신할 수는 없습니다.

실패한 명령과 프록시 설정 위치

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

현재 터미널에서 임시 프록시 테스트 후 바로 해제하기

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

아래 예시는 기존 프록시 설정이 없는 임시 터미널에서만 사용하세요. 먼저 HTTP_PROXY, HTTPS_PROXY, NO_PROXY, ALL_PROXY의 대소문자 변형을 확인한 뒤 뒷부분의 pip config debug와 conda config --show-sources로 도구 설정의 출처를 확인하세요.

어느 출처에든 기존 프록시 설정이 있다면 원래 값과 설정 위치를 저장하고 뒷부분의 해당 절차에 따라 처리하세요. 아래 덮어쓰기 및 삭제 명령을 바로 실행하지 마세요. 회사가 지정한 프록시는 그대로 두세요. 새 창도 이전 변수를 상속할 수 있으므로 새로 열었다고 설정이 없다고 판단하면 안 됩니다.

기존 프록시 설정 출처가 없음을 확인한 뒤 예시를 실행하세요. 끝나면 이번에 추가한 변수만 삭제하고 임시 창을 닫으세요. 원래 창과 영구 설정은 바뀌지 않습니다. 기존 값을 직접 바꿨다면 기록을 보고 복원해야 하며, unset이나 변수 삭제는 복원을 대신할 수 없습니다.

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 --ignore-installed --no-cache-dir 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 --ignore-installed --no-cache-dir packaging

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

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 --user 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 확인

~/.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, Conda, Git에서 정상적으로 다운로드할 수 있나요?

완료 조건

  • 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 포트를 계속 가리키지 않음
  • 인증서 검증이 켜진 상태로 유지됨

참고 자료