11강. 패키지 공유 구현

0. 학습 목표
→ 패키지 목록을 requirements.txt로 저장하고, 새 환경에서 같은 조합을 복원합니다.
0.1 이번 글에서 다룰 내용
이번 글은 구현 중심 강의입니다.
10강에서 세운 원칙 — "폴더가 아니라 목록을 공유한다" — 을 터미널에서 실행합니다.
실습은 두 PC를 오가는 상황의 시뮬레이션입니다.
기존 프로젝트 역할의 폴더(Project)에서 목록을 저장하고,
새 PC 역할의 폴더(Project_New)에서 그 목록으로 환경을 복원합니다.
# [기존 프로젝트: Project]
프로젝트 구성 (venv + 패키지 설치)
↓
python -m pip freeze > requirements.txt (목록 저장)
↓
requirements.txt 를 새 환경으로 전달
↓
# [새 환경: Project_New]
새 venv 생성
↓
python -m pip install -r requirements.txt (목록으로 복원)
↓
두 환경의 패키지 목록이 일치 ← 이번 강의의 성공 지점
0.2 이번 강의에서 직접 다루는 구조
이번에는 테스트용 이름(test_venv) 대신 실무 관례를 따릅니다.
가상환경 폴더 이름은 .venv가 널리 쓰이는 관례이며, 프로젝트 폴더 안에 숨김 폴더로 둡니다.
~/Dev/
├── Project/ ← ➕ 기존 프로젝트 역할
│ ├── .venv/ ← ➕ python3.13 기반 가상환경
│ ├── main.py ← ➕ 소스 코드 (공유 대상)
│ ├── window.py ← ➕ 소스 코드 (공유 대상)
│ ├── database.py ← ➕ 소스 코드 (공유 대상)
│ └── requirements.txt ← ➕ 이번 강의의 핵심 산출물 (공유 대상)
└── Project_New/ ← ➕ 새 PC 역할
├── .venv/ ← ➕ 새로 만드는 가상환경 (복사 아님!)
└── requirements.txt ← Project에서 전달받은 파일
(➕ 새로 생성 · ✏️ 수정 · 표시 없음은 변경 없음)
1. 기존 프로젝트 환경 만들기
→ 공유의 출발점이 될 프로젝트를 소스 파일과 패키지까지 갖춰 구성합니다.
프로젝트 폴더를 만들고, 그 안에 python3.13 기반 가상환경을 만들어 활성화합니다.
4·6강에서 반복한 절차 그대로이므로 명령만 빠르게 진행합니다.

mkdir -p ~/Dev/Project
cd ~/Dev/Project
python3.13 -m venv .venv # 관례에 따라 .venv 이름으로 생성
source .venv/bin/activate
GUI 화면을 위한 PySide6,
MySQL 연결을 위한 mysql-connector-python
두 패키지가 필요한 프로젝트라고 가정하고 함께 설치합니다.

python -m pip install PySide6 mysql-connector-python # 패키지 두 개를 한 번에 설치
소스 파일도 만들어 프로젝트 모양을 갖춥니다.
touch는 빈 파일을 만드는 명령입니다. 이번 강의의 주제는 패키지 공유이므로 파일 내용은 비워 두어도 됩니다.


touch main.py window.py database.py # 빈 소스 파일 3개 생성
| 파일명 | 역할 |
main.py |
프로그램을 실행하는 시작 파일 |
window.py |
PySide6로 GUI 화면을 구성하는 파일 |
database.py |
mysql-connector-python으로 DB에 연결하는 파일 |
✔ 확인 기준: 프롬프트에 (.venv)가 표시되고, python -m pip show PySide6의 Location이 ~/Dev/Project/.venv/...로 나오면 기존 프로젝트 구성 완료입니다.
9강에서 배운 Location 검증을 여기서도 습관처럼 적용하는 것입니다.
2. requirements.txt 생성하기
→ pip freeze로 현재 가상환경의 패키지 목록을 파일로 저장합니다.
가상환경이 활성화된 상태에서 다음 명령을 실행합니다.

python -m pip freeze > requirements.txt # 현재 환경의 패키지 목록을 파일로 저장
명령을 둘로 나눠 읽으면 됩니다. pip freeze는 현재 가상환경에 설치된 모든 패키지를 이름==버전 형식으로 출력하는 명령이고, >는 그 출력을 화면 대신 파일로 저장하는 리다이렉션 기호입니다. 생성된 파일을 확인해 봅니다.
출력 예시:


cat requirements.txt
mysql-connector-python==8.4.0
PySide6==6.7.0
PySide6_Addons==6.7.0
PySide6_Essentials==6.7.0
shiboken6==6.7.0
(버전 숫자는 설치 시점에 따라 다를 수 있습니다.)
직접 설치한 것은 두 개인데 목록에는 다섯 개가 있습니다.
9강에서 본 의존성(shiboken6 등)까지 pip freeze가 빠짐없이 기록했기 때문입니다.
덕분에 새 환경에서는 의존성을 신경 쓸 필요 없이 이 목록만 설치하면 됩니다.
10강의 표현으로, 이 텍스트 파일이 바로 "재설치 설명서"입니다.
✔ 확인 기준: cat requirements.txt에 이름==버전 형식의 목록이 출력되면 완료입니다.
파일이 비어 있다면 가상환경 활성화 전에 freeze를 실행했을 가능성이 큽니다.
(.venv) 표시를 확인하고 다시 실행하세요.
3. 새 환경에서 패키지 복원하기
→ 새 폴더에 새 가상환경을 만들고, requirements.txt만으로 같은 조합을 재설치합니다.
3.1 새 프로젝트 환경 준비
이제 "새 PC" 역할의 폴더를 만듭니다.
실제 상황이라면 다른 컴퓨터겠지만, 원리는 같으므로 새 폴더로 시뮬레이션합니다.
지금 열려 있는 터미널의 가상환경을 먼저 비활성화하고 이동합니다.

deactivate # Project의 가상환경에서 빠져나옴
mkdir -p ~/Dev/Project_New
cd ~/Dev/Project_New
python3.13 -m venv .venv # 새 가상환경을 "새로 생성" (Project의 .venv 복사 아님!)
source .venv/bin/activate
requirements.txt를 기존 프로젝트에서 가져옵니다.
실제로는 이메일·USB·GitHub로 전달받는 파일이지만, 여기서는 복사 명령으로 대신합니다.

cp ~/Dev/Project/requirements.txt . # 기존 프로젝트의 목록 파일을 현재 폴더로 복사
이 시점의 새 환경은 목록 파일만 있고 패키지는 없는 상태입니다. 확인해 보면:
python -m pip show PySide6
WARNING: Package(s) not found: PySide6 ← 새 가상환경은 비어 있음 (정상)
3.2 목록 기준으로 일괄 설치
pip가 requirements.txt를 읽어 다섯 패키지를 기록된 버전 그대로 설치합니다.

python -m pip install -r requirements.txt # -r: 목록 파일에 적힌 대로 설치
설치가 끝나면 복원이 정말 되었는지 두 환경의 목록을 비교합니다. 이것이 이번 강의의 최종 검증입니다.
python -m pip freeze # 새 환경의 목록 출력
cat requirements.txt # 전달받은 목록과 비교
두 출력이 같으면 — 기존 환경의 조합이 새 환경에 그대로 재현된 것입니다.
Location도 확인해 보면 새 가상환경 내부로 나옵니다.
python -m pip show PySide6

Name: PySide6
Version: 6.7.0 ← 기존 환경과 같은 버전
Location: /home/사용자명/Dev/Project_New/.venv/lib/python3.13/site-packages
─────────── 새 환경 자신의 .venv에 설치됨
정리하면, 옮긴 것은 몇 줄짜리 텍스트 파일 하나뿐인데 결과는 수백 MB짜리 환경의 완전한 복원입니다.
10강에서 .venv 복사가 안 되는 이유로 꼽았던 용량·경로·OS·버전 문제가 이 방식에서는 아예 발생하지 않습니다.
각 환경이 자기 위치에서, 자기 OS에 맞게, 새로 만들어졌기 때문입니다.
3.3 정리
기존 프로젝트
→ 가상환경 활성화
→ python -m pip freeze > requirements.txt
→ requirements.txt 공유
새 프로젝트 환경
→ 새 가상환경 생성
→ 가상환경 활성화
→ python -m pip install -r requirements.txt
→ 패키지 설치 확인
→ python main.py 실행
| 구분 | 명령어 | 의미 |
| 목록 저장 | python -m pip freeze > requirements.txt |
현재 환경의 패키지 목록 기록 |
| 목록 복원 | python -m pip install -r requirements.txt |
목록 기준으로 일괄 설치 |
| 복원 검증 | python -m pip freeze / pip show |
목록 일치와 설치 위치 확인 |
✔ 확인 기준: Project_New에서 python -m pip freeze의 출력이 requirements.txt 내용과 일치하고, pip show PySide6의 Location이 Project_New/.venv/...이면 이번 강의 완료입니다. 설치 중 버전 관련 오류가 나면 새 가상환경의 Python 버전이 기존과 같은지(python --version = 3.13.x) 먼저 확인하세요 — 10강 2.4에서 본 대로, requirements.txt는 패키지 목록만 기록할 뿐 Python 버전은 직접 맞춰야 합니다.
→ 다음 강의 (12강): 이번 실습에서 requirements.txt는 cp 명령으로 전달했지만, 실제 협업에서는 소스 코드와 함께 GitHub로 공유합니다. 여러 개발자가 GitHub 저장소를 기준점으로 작업물을 주고받는 전체 협업 구조를 정리합니다.