Step 53. pip와 가상환경 — 세계의 도구를 내 방에 들이는 법
Level 1 — 프로그래밍과 컴퓨터 내부 | 난이도 ★★☆☆☆ | 예상 소요 시간 3시간
전제: Step 41~52 완료. 파이썬 기본 문법과 표준 라이브러리(Step 51)를 압니다. 오늘 실습에는 인터넷 연결이 필요합니다.
- 준비물: 파이썬이 설치된 PC, 파워쉘, 인터넷 연결.
- 주의: 오늘부터 남이 만든 코드를 내 컴퓨터에 설치합니다. 그래서 규칙이 하나 생깁니다 — 패키지 이름의 철자를 정확히 확인하고, 유명한 것만 설치합니다. 오늘 설치하는 requests는 전 세계에서 가장 널리 쓰이는 파이썬 패키지 중 하나입니다.
Step 51에서 우리는 표준 라이브러리라는 기본 도구 상자를 썼습니다. 그런데 파이썬의 진짜 힘은 그 바깥에 있습니다. 전 세계 개발자들이 만들어 올린 수십만 개의 외부 도구 — 웹 요청을 두 줄로 해 주는 requests, 엑셀을 다루는 openpyxl, 네트워크 패킷을 만지는 scapy. 이 보너스 상자를 여는 열쇠가 오늘의 주인공 pip입니다.
그런데 마구 설치하면 문제가 생깁니다. 프로젝트 A는 어떤 도구의 1.0 버전을, 프로젝트 B는 2.0을 요구하면 컴퓨터 하나에 둘을 동시에 깔 수 없어 충돌합니다. 그래서 프로젝트마다 독립된 작은 방을 만들어 그 안에서만 설치하는 기술이 가상환경입니다. 오늘은 열쇠(pip)와 방(가상환경), 그리고 방의 재료 목록(requirements.txt)까지, 외부 도구를 쓰는 전체 체계를 배웁니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- pip과 PyPI가 무엇인지, 의존성이 무엇인지 설명한다
- 가상환경(venv)을 만들고 켜고(활성화) 끈다
- 외부 패키지 requests를 설치해 웹 페이지를 두 줄로 가져온다
- requirements.txt로 패키지 목록을 기록하고 그 용도를 설명한다
- 패키지 삭제와 재설치로 환경을 "고장 내고 고칠" 수 있다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | 파이썬 3.12 + 파워쉘. 인터넷 연결 필요 |
| 오늘의 명령어 | python -m venv venv(방 만들기), .\venv\Scripts\Activate.ps1(켜기), pip install / list / freeze / show / uninstall, deactivate(끄기) |
| 필요한 개념 | pip과 PyPI, 의존성(dependency), 가상환경(virtual environment), requirements.txt |
2-1. pip — 파이썬의 앱스토어
pip은 파이썬 패키지(남이 만든 도구 묶음)를 찾아 설치하고 지워 주는 관리자입니다. PyPI(Python Package Index)라는 거대한 공개 저장소(pypi.org)에서 가져옵니다. pip install requests 한 줄이면 저장소에서 requests를 찾아 내 컴퓨터에 깔아 줍니다. 스마트폰의 앱스토어와 같은 자리입니다.
2-2. 의존성 — 도구의 도구
설치한 패키지가 또 다른 패키지를 필요로 하는 경우가 많습니다. 이 관계를 의존성(dependency)이라고 합니다. pip은 의존성까지 알아서 함께 설치합니다. 편리하지만, 버전이 얽히면 "이 프로젝트에서는 되는데 저 프로젝트에서는 안 되는" 상황이 생깁니다.
2-3. 가상환경 — 프로젝트별 독립 방
그 얽힘을 원천 차단하는 것이 가상환경(virtual environment)입니다. 프로젝트 폴더 안에 파이썬 실행 파일과 패키지를 담은 독립 공간을 하나 만들고, 그 안에서만 설치하는 것입니다. 방마다 다른 버전의 도구를 가질 수 있어 충돌이 사라집니다. 파이썬에 기본 포함된 venv 모듈로 만듭니다.
2-4. requirements.txt — 재료 목록
"이 프로젝트에 무엇이 깔려 있어야 하는가"를 버전과 함께 적어 둔 목록 파일입니다. 이 파일만 있으면 다른 컴퓨터에서도 pip install -r requirements.txt 한 줄로 똑같은 환경을 재현합니다. 협업과 이사(새 컴퓨터로 옮기기)의 표준 관례입니다.
3. 따라 하기
오늘 실습은 파워쉘에서 진행합니다. 프로젝트 폴더(security-study)에서 시작하세요.
3-1. pip 상태 확인
pip --version
pip 25.0.1 from C:\...\venv\Lib\site-packages\pip (python 3.12)
(2026-09-09 실측. 버전 숫자는 다를 수 있습니다.)
출력 읽는 법: pip의 버전과 위치가 보이면 준비 완료입니다. 오류가 나면 Step 41의 파이썬 설치 단계(환경 변수)를 다시 확인하세요.
3-2. 가상환경 만들기
python -m venv venv
(출력 없이 조용히 끝남)
(2026-09-09 실측. 수십 초 걸릴 수 있습니다.)
출력 읽는 법: python -m venv는 "파이썬아, venv 모듈을 실행해"라는 뜻이고, 뒤의 venv는 만들 방의 이름입니다(관례적으로 venv라고 짓습니다). 끝나면 폴더 안에 venv라는 새 폴더가 생깁니다. 탐색기로 열어 보면 이렇게 생겼습니다 (2026-09-09 실측):
venv\
├─ Include\
├─ Lib\
├─ Scripts\ ← python.exe, pip.exe, Activate.ps1이 여기에
└─ pyvenv.cfg
조용히 끝나는 것이 정상입니다. 이것이 우리의 독립 방입니다.
3-3. 가상환경 켜기 (활성화)
.\venv\Scripts\Activate.ps1
(venv) PS C:\Users\Lee\Desktop\security-study>
출력 읽는 법: 프롬프트 맨 앞에 (venv)가 붙으면 방 안에 들어온 것입니다. 이 상태에서의 설치는 전부 이 방 안에만 쌓입니다. 끄고 싶으면 deactivate를 입력합니다.
벽 예고: 여기서 빨간 오류(실행 정책)가 나는 분이 많습니다. 오류가 나면 아래 6번 섹션의 벽 1을 먼저 보고 오세요.
왜 하는가: "켜져 있는가"를 프롬프트로 확인하는 습관이 가상환경 사용의 절반입니다.
3-4. requests 설치와 첫 웹 요청
가상환경이 켜진 상태에서:
pip install requests
Collecting requests
...
Installing collected packages: urllib3, idna, charset_normalizer, certifi, requests
Successfully installed certifi-2026.7.22 charset_normalizer-3.5.1 idna-3.19 requests-2.34.2 urllib3-2.7.0
(2026-09-09 실측. 버전은 그날그날 달라집니다.)
출력 읽는 법: requests 하나를 시켰는데 다섯 개가 깔렸습니다. 나머지 네 개가 의존성 — requests가 필요로 하는 도구들을 pip이 알아서 함께 설치한 것입니다.
이제 fetch.py를 만듭니다:
import requests
r = requests.get("https://example.com")
print("상태 코드:", r.status_code)
print("본문 앞 80자:")
print(r.text[:80])
상태 코드: 200
본문 앞 80자:
<!doctype html><html lang="en"><head><title>Example Domain</title><link rel="ico
(2026-09-09 실측.)
출력 읽는 법: 상태 코드 200은 "성공"이라는 웹의 답입니다(Step 34에서 본 그 숫자입니다). 단 세 줄로 웹 페이지를 가져왔습니다. 표준 라이브러리만으로 하면 수십 줄이던 일입니다.
왜 하는가: 웹과 대화하는 도구는 정보 수집, API 사용, CTF 웹 문제의 기본기입니다.
3-5. 설치 목록과 재료 목록 만들기
pip list
pip freeze > requirements.txt
Package Version
------------------ ---------
certifi 2026.7.22
charset-normalizer 3.5.1
idna 3.19
pip 25.0.1
requests 2.34.2
urllib3 2.7.0
(2026-09-09 실측.)
생성된 requirements.txt를 메모장으로 열면:
certifi==2026.7.22
charset-normalizer==3.5.1
idna==3.19
requests==2.34.2
urllib3==2.7.0
(2026-09-09 실측.)
출력 읽는 법: pip list는 방 안에 깔린 것들을 보여 주고, pip freeze는 그 목록을 "버전까지 적힌 재료 목록" 형식(이름==버전)으로 출력합니다. >로 파일에 저장했습니다.
예측해 보기: 이 파일이 있으면 새 가상환경에서
pip install -r requirements.txt한 줄로 어떻게 될까요? 정답은 "똑같은 환경이 통째로 재현된다"입니다.
3-6. 가상환경 끄기와 되돌아오기
deactivate
읽는 법: 프롬프트에서 (venv)가 사라집니다. 방 밖으로 나온 것입니다. 다시 들어갈 때는 3-3의 Activate 명령을 다시 치면 됩니다. 방은 지워지지 않고 그대로 남아 있습니다.
3-7. 패키지 정보와 삭제 — 고장 내고 고치기
설치한 패키지의 신분증을 확인하고, 지우고, 다시 깔아 봅니다. 가상환경이 켜진 상태에서:
pip show requests
Name: requests
Version: 2.34.2
Summary: Python HTTP for Humans.
Author-email: Kenneth Reitz <me@kennethreitz.org>
...
(2026-09-09 실측.)
이제 실험 삼아 지웁니다:
pip uninstall requests
지울 목록을 보여 주고 Proceed (Y/n)?라고 물으면 Y를 누릅니다:
Uninstalling requests-2.34.2:
Successfully uninstalled requests-2.34.2
이 상태에서 python fetch.py를 실행하면:
ModuleNotFoundError: No module named 'requests'
(2026-09-09 실측. 삭제 → 오류 → 재설치로 복구까지 전부 확인했습니다.)
읽는 법: requests가 없으니 import에서 죽는 것이 당연합니다. pip install requests로 다시 설치하면 복구됩니다. 이 "고장 내고 고치기"가 환경 다루기의 가장 빠른 훈련입니다. 환경은 조심스레 만지는 것이 아니라, 언제든 다시 만들 수 있는 것입니다.
4. 미션과 연습문제
미션 — 나만의 도구 방 세팅
- security-study 폴더에 가상환경을 만들고 켭니다
- requests를 설치하고, 다음 세 가지를 출력하는
check_site.py를 작성합니다: 상태 코드, 응답 크기(len(r.text)), 응답 시간(r.elapsed) - 확인할 주소는 인자(sys.argv, Step 51 복습)로 받습니다. 사용법:
python check_site.py https://example.com requirements.txt를 만들고 내용을 노트에 옮겨 적습니다- 가상환경을 끄고 다시 켜는 연습을 두 번 합니다 — 켜짐 확인은 프롬프트의
(venv)로
주소를 바꿔 가며 세 곳 이상을 확인해 보세요. 단, 확인하는 곳은 example.com 같은 시험용 사이트나 내가 만든 페이지로 한정합니다.
연습문제
문제 1. pip install requests 하나로 다섯 개의 패키지가 설치됐습니다. 나머지 네 개는 무엇이며, pip은 왜 그것들을 함께 설치하나요?
문제 2. 가상환경이 켜져 있는지 아닌지를 한눈에 아는 방법은 무엇이며, 켜지 않은 채 설치하면 어떤 문제가 생기나요?
문제 3. requirements.txt의 requests==2.34.2에서 ==는 무슨 뜻이며, 이 파일이 "환경 이사"를 어떻게 가능하게 하나요?
문제 4. 프로젝트를 다른 컴퓨터로 옮길 때 venv 폴더를 통째로 복사하지 않는 이유는 무엇인가요? 대신 무엇을 옮기고, 새 컴퓨터에서 어떤 순서로 복원하나요?
5. 모범 답안과 완료 기준
미션 모범 답안
check_site.py:
import sys
import requests
if len(sys.argv) < 2:
print("사용법: python check_site.py <주소>")
sys.exit(1)
url = sys.argv[1]
try:
r = requests.get(url, timeout=10)
except requests.exceptions.RequestException as e:
print("접속 실패:", e)
sys.exit(1)
print("주소:", url)
print("상태 코드:", r.status_code)
print("응답 크기:", len(r.text), "글자")
print("응답 시간:", r.elapsed)
검증하는 법: ① (venv)가 보이는 상태에서 python check_site.py https://example.com이 상태 코드 200을 출력하는가. ② 인자 없이 실행하면 사용법이 나오는가. ③ 주소를 틀리게 주면("htp://…") 죽지 않고 "접속 실패"가 나오는가. ④ pip freeze > requirements.txt 후 파일에 requests와 의존성들이 버전과 함께 적혀 있는가. timeout=10은 "10초 넘게 답이 없으면 포기하라"는 안전장치입니다 — 웹 요청 코드의 기본 예의입니다.
연습문제 해답
문제 1 해답. 의존성(dependency)입니다 — requests가 내부적으로 사용하는 도구들(certifi, charset-normalizer, idna, urllib3)입니다. pip은 패키지의 "이것들이 필요합니다" 정보를 읽어 의존성을 자동으로 함께 설치합니다 (2026-09-09 실측 출력에서 확인).
문제 2 해답. 프롬프트 맨 앞의 (venv) 표시로 압니다. 켜지 않은 채 설치하면 컴퓨터 전체(전역)에 깔려서, 프로젝트마다 다른 버전이 필요할 때 충돌합니다. "설치 전에 프롬프트 확인"이 습관이어야 합니다.
문제 3 해답. "정확히 이 버전"이라는 고정 표시입니다. 이 파일과 pip install -r requirements.txt가 있으면, 어떤 컴퓨터에서든 같은 버전들을 그대로 설치해 환경을 재현할 수 있습니다. 코드만 옮기고 환경은 레시피로 재현하는 것이 표준 관례입니다.
문제 4 해답. venv 폴더는 용량이 크고, 언제든 다시 만들 수 있고, 운영체제가 다르면 통째로 쓸 수도 없기 때문입니다. 옮길 짐은 코드와 requirements.txt뿐입니다. 새 컴퓨터에서는 ① python -m venv venv로 방 생성 → ② 활성화 → ③ pip install -r requirements.txt로 재현, 세 줄이면 끝납니다.
완료 기준 체크리스트
- [ ] pip과 PyPI, 의존성이 무엇인지 설명할 수 있다
- [ ]
python -m venv venv로 가상환경을 만들 수 있다 - [ ] 활성화/비활성화를 할 수 있고
(venv)표시로 상태를 확인한다 - [ ] requests를 설치해 웹 요청을 성공시켰다
- [ ] requirements.txt를 만들고 그 용도를 설명할 수 있다
- [ ] 패키지 삭제 → 오류 확인 → 재설치의 고장 내고 고치기를 해 봤다
- [ ] 미션: check_site.py 완성과 방 세팅을 마쳤다
6. 흔한 실수와 해결
벽 1. Activate.ps1에서 빨간 실행 정책 오류
증상: "이 시스템에서 스크립트를 실행할 수 없으므로…"라는 빨간 오류 (전형적인 메시지 예시):
...Activate.ps1 파일을 로드할 수 없습니다. 이 시스템에서 스크립트를 실행할 수 없으므로...
원인: 파워쉘의 기본 보안 정책이 스크립트 실행을 막고 있습니다. 파워쉘은 스크립트가 아무나 실행되는 것을 막기 위해 기본적으로 잠겨 있습니다.
해결: 파워쉘에 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser를 입력하고 Y로 답합니다. "내 컴퓨터의 로컬 스크립트는 허용"하는 설정으로, 현재 사용자에게만 적용됩니다. 그 후 Activate를 다시 실행하세요. (참고: 명령 프롬프트(cmd)에서는 venv\Scripts\activate.bat으로 정책 없이 켤 수 있습니다.)
벽 2. 설치했는데 import가 안 된다
증상: pip install은 성공했는데 스크립트에서 ModuleNotFoundError: No module named 'requests' (2026-09-09 실측으로 재현 확인).
원인: 설치한 곳과 실행하는 곳이 다릅니다. 가상환경에 깔았는데 가상환경 밖의 파이썬으로 실행한 경우가 대표적입니다.
해결: 프롬프트에 (venv)가 있는지 확인하고, 그 상태에서 python fetch.py로 실행하세요. 에디터를 쓴다면 에디터의 파이썬 해석기도 venv 안의 것으로 지정해야 합니다.
벽 3. 전역에 마구 설치한다
증상: 가상환경 없이 모든 것을 컴퓨터 전체에 설치해, 나중에 프로젝트끼리 버전이 꼬입니다.
원인: 습관입니다. 처음엔 귀찮아 보여서 방 만들기를 건너뜁니다.
해결: "새 프로젝트 = 새 venv"를 공식처럼 외우세요. 꼬인 환경을 푸는 것보다 방 하나 새로 만드는 것이 언제나 빠릅니다. venv 폴더는 지우면 그만입니다.
벽 4. 설치 중 빨간 글자가 잔뜩 나오고 실패한다
증상: 설치가 실패하며 긴 오류가 출력됩니다.
원인: 네트워크 문제, 방화벽, 또는 패키지 이름 오타.
해결: 오류의 마지막 줄을 읽으세요. Could not find a version...이면 이름 오타(requests를 requets로 치는 오타가 흔합니다), 연결 관련 메시지면 네트워크를 점검합니다.
벽 5. pip이 python을 못 찾는다 / 반대로 python이 pip를 모른다
증상: pip은 되는데 python이 안 되거나 그 반대.
원인: 둘이 다른 파이썬 설치를 가리키는 경우입니다. 컴퓨터에 파이썬이 여러 개 깔려 있을 때 흔합니다.
해결: python -m pip install requests 형태를 쓰세요. "지금 이 python의 pip으로"라는 뜻이라 둘이 어긋날 수 없습니다. 특히 가상환경 안에서는 이 형태가 가장 확실합니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| pip | PyPI 저장소에서 패키지를 설치·삭제하는 관리자 |
| PyPI | 전 세계 파이썬 패키지의 공개 저장소 |
| 의존성 | 패키지가 필요로 하는 또 다른 패키지 |
| 가상환경(venv) | 프로젝트별 독립 설치 공간 — 버전 충돌 차단 |
| requirements.txt | 버전까지 적힌 재료 목록 — 환경 재현의 열쇠 |
오늘의 명령어
| 명령 | 하는 일 |
|---|---|
python -m venv venv |
가상환경 만들기 |
.\venv\Scripts\Activate.ps1 |
가상환경 켜기 (파워쉘) |
deactivate |
가상환경 끄기 |
pip install 패키지 |
설치 (의존성 포함) |
pip list / pip show 패키지 |
목록 / 신분증 확인 |
pip freeze > requirements.txt |
재료 목록 기록 |
pip install -r requirements.txt |
목록으로 환경 재현 |
pip uninstall 패키지 |
삭제 |
명령어보다 중요한 감각
오늘 배운 명령을 흐름으로 정리하면 여섯 줄입니다. 방을 만들고(python -m venv venv), 들어가고(Activate), 설치하고(pip install), 목록을 남기고(pip freeze > requirements.txt), 나오고(deactivate), 다른 곳에서는 목록으로 재현합니다(pip install -r requirements.txt). 이 여섯 줄이 파이썬 개발자들이 매일 도는 순환입니다.
두 가지를 더 기억해 두세요. 첫째, pip install은 "남이 만든 코드를 내 컴퓨터에서 실행할 수 있게 까는 것"입니다. 저장소에는 유명 패키지와 철자가 비슷한 가짜(타이포스쿼팅 악성 패키지)도 올라옵니다. 이름 철자 확인, 유명하고 다운로드 수 많은 것 고르기, 출처 불명의 "이거 깔아 봐" 무시하기 — 도구를 까는 순간이 곧 신뢰를 주는 순간입니다. 둘째, 프로젝트 폴더에 SETUP.md를 만들어 오늘 한 일을 적어 두세요. "실행 정책 오류가 나서 이렇게 해결했다"까지요. 두 달 뒤의 여러분을 살리는 것은 기억력이 아니라 기록입니다.
전부 체크되면 Step 53 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.