10강 개념 중심 ⏱ 약 15분

 

0. 학습 목표

→ 프로젝트를 다른 환경으로 옮길 때 무엇을 공유하고 무엇을 공유하지 않는지 기준을 세웁니다.

더보기

이번 글은 개념 중심 강의입니다.

 

9강에서 test_venv2 안에 "Python 3.13 + PySide6" 조합을 완성했습니다.

이제 이 프로젝트를 다른 PC에서 실행해야 한다고 가정해 봅시다.

 

 

가장 먼저 떠오르는 방법은 단순합니다 — "가상환경 폴더째 압축해서 옮기면 되지 않을까?" 이번 강의에서는 이 직관적인 방법이 왜 실패하는지 확인하고, 대신 사용하는 올바른 방식인 requirements.txt를 이해합니다.

 

 

결론을 미리 요약하면 다음과 같습니다. 가상환경 폴더는 "결과물"이라 옮기지 않고, 그 결과물을 다시 만들 수 있는 "재설치 설명서"인 requirements.txt만 공유합니다.

구분 내용
이해할 것 소스 코드만 옮기면 부족한 이유, .venv 폴더를 직접 옮기면 안 되는 네 가지 이유
정리할 것 공유할 것(소스 코드 + requirements.txt)과 공유하지 않을 것(.venv)의 구분 기준
확인할 것 "가상환경은 옮기는 대상이 아니라 다시 만드는 대상"이라는 원칙

 

1. 문제 상황 — 소스 코드만으로는 부족하다

→ 내 코드를 다른 PC로 옮겼을 때 실행이 실패하는 이유를 확인합니다.

더보기

Python 프로젝트는 보통 외부 패키지를 사용합니다.

GUI 화면에는 PySide6가, MySQL 연결에는 mysql-connector-python 같은 패키지가 필요합니다.

작업중인 Python 프로젝트
→ PySide6 사용
→ mysql-connector-python 사용
→ 외부 패키지 필요

 

 

그런데 7강에서 확인했듯 패키지의 정체는 site-packages 폴더에 설치된 별도의 폴더입니다.

내가 작성한 main.py 파일 안에 패키지가 들어 있는 것이 아닙니다.

그래서 main.py만 다른 PC로 옮기면 이런 일이 벌어집니다.

기존 PC (9강까지의 환경)
→ main.py 있음
→ test_venv2 안에 PySide6 설치됨
→ 실행 성공

main.py 파일만 새 PC로 복사
        ↓
새 PC
→ main.py 있음
→ PySide6 없음 ❌
→ ModuleNotFoundError 발생          ← 코드는 그대로인데 실행 실패

 

 

8강에서 본 호환성 문제의 재현입니다.

코드가 있다는 것과 실행된다는 것은 다르고, 실행에는 패키지 조합이 함께 준비되어야 합니다.

그렇다면 그 조합을 어떻게 새 PC로 가져갈 것인가 — 이것이 이번 강의의 질문입니다.

 

2. 왜 .venv 폴더를 통째로 옮기면 안 되는가

→ 가장 직관적인 해결책이 실패하는 네 가지 이유를 확인합니다.

더보기

"패키지가 test_venv2 안에 있으니, 그 폴더째 압축해서 옮기면 되지 않을까?" 자연스러운 생각이지만,

이 방법은 네 가지 이유로 권장하지 않습니다.

 

 

2.1 이유 1 — 용량이 크다

가상환경 폴더에는 Python 실행 파일, pip 관련 파일, 설치된 패키지 전체가 들어 있습니다.

9강에서 설치한 PySide6처럼 GUI 패키지는 특히 용량이 큽니다.

수백 MB짜리 폴더를 옮기는 것과, 아래에서 볼 몇 줄짜리 텍스트 파일을 옮기는 것 — 결과가 같다면 답은 분명합니다.

.venv
├─ bin
├─ lib
│  └─ python3.x
│     └─ site-packages
│        ├─ PySide6
│        ├─ shiboken6
│        └─ 기타 패키지

따라서 .venv 폴더를 그대로 압축해서 공유하면 파일 용량이 불필요하게 커질 수 있습니다.

반면 requirements.txt는 텍스트 파일이기 때문에 용량이 매우 작습니다.

공유 방식특징
.venv 폴더 공유 용량이 큼
requirements.txt 공유 용량이 작음
새 환경에서 재설치 필요한 패키지만 다시 설치 가능

 

 

 

 

2.2 이유 2 — 내부가 생성 위치의 경로에 묶여 있다

가상환경은 처음 만들어진 위치를 기준으로 동작합니다. 6강에서 확인한 pyvenv.cfg를 떠올려 보세요 — 원본 Python의 절대 경로가 기록되어 있었습니다. 활성화 스크립트 등 내부 파일들도 생성 당시 경로를 기준으로 만들어집니다.

기존 PC
→ /home/basiclike/Project/.venv

새 PC
→ /home/student/NewProject/.venv

사용자명이나 폴더 구조가 조금만 달라도 내부 경로가 어긋나 오작동할 수 있습니다. 즉 가상환경은 복사해서 옮기는 대상이 아니라, 새 위치에서 다시 만드는 대상입니다.

 

 

 

 

2.3 이유 3 — 운영체제마다 구조가 다르다

가상환경의 내부 구조는 OS에 따라 다릅니다. 이 시리즈에서 계속 사용한 활성화 경로가 Windows에서는 아예 다른 위치입니다.

운영체제 가상환경 실행 파일 위치
Ubuntu / macOS .venv/bin/python
Windows .venv\Scripts\python.exe

따라서 Ubuntu에서 만든 가상환경을 Windows로(또는 그 반대로) 그대로 옮기는 것은 구조적으로 동작할 수 없습니다. 협업 상대가 어떤 OS를 쓸지는 알 수 없으므로, OS에 묶인 폴더를 공유하는 방식 자체가 부적합합니다.

 

 

 

 

2.4 이유 4 — Python 버전이 다르면 동작하지 않는다

가상환경은 특정 Python 버전을 기준으로 만들어집니다.

예를 들어 기존 프로젝트에서 Python 3.13으로 가상환경을 만들었다고 가정합니다.

기존 프로젝트
→ Python 3.13 기반 .venv

 

그런데 새 PC에는 Python 3.12만 설치되어 있을 수 있습니다.

새 PC
→ Python 3.12만 설치됨

이 경우 기존 .venv 폴더를 그대로 옮겨도 정상적으로 동작하지 않을 수 있습니다.

 

그래서 새 환경에서는 1) Python 버전에 맞게 가상환경을 새로 만들고, 2) requirements.txt를 기준으로 패키지를 다시 설치하는 것이 안전합니다.

 

3. 올바른 방식 — requirements.txt로 목록만 공유한다

→ 결과물 대신 재설치 설명서를 공유한다는 원칙과 그 동작 방식을 이해합니다.

더보기

3.1 requirements.txt란?

네 가지 이유의 공통 결론은 "폴더가 아니라 정보를 옮겨야 한다"입니다.

새 PC에 필요한 정보는 사실 단순합니다 — 어떤 패키지의 어떤 버전이 필요한가?

이 목록을 기록한 텍스트 파일이 requirements.txt입니다.

PySide6==6.7.0
mysql-connector-python==8.4.0

 

중요한 것은 이 파일이 패키지 기능을 담고 있는 파일이 아니라는 점입니다.

패키지의 이름과 버전, 즉 "필요한 것의 목록"만 적혀 있습니다.

 

== 뒤의 숫자가 버전 고정입니다 — 8강에서 본 것처럼 버전이 달라지면 동작이 달라질 수 있으므로, 정확한 버전을 기록해 두는 것이 핵심입니다. 이 파일이 있으면 새 환경에서 다음 한 줄로 같은 조합을 다시 설치할 수 있습니다.

python -m pip install -r requirements.txt      # -r: 파일에 적힌 목록(requirements)대로 설치

 

 

 

 

3.2 공유 기준 정리

이제 무엇을 공유하고 무엇을 공유하지 않는지 기준이 섰습니다.

항목 공유 여부 이유
소스 코드 (main.py 등) 공유 ⭕ 직접 작성한 프로그램 — 프로젝트의 본체
requirements.txt 공유 ⭕ 환경을 다시 만들 수 있는 재설치 설명서
.venv / venv 폴더 공유 ❌ 용량·경로·OS·버전에 묶인 결과물 — 새 환경에서 다시 만든다

이 방식의 장점은 공유에서 끝나지 않습니다. 환경이 꼬였을 때의 문제 해결 절차도 같은 원리로 단순해집니다. 4강에서 "가상환경은 소모품"이라고 했던 것이 여기서 완성됩니다.

환경에 문제가 생겼을 때

기존 .venv 삭제
→ 새 .venv 생성
→ requirements.txt 기준 재설치
→ 실행 확인                          ← 언제든 처음부터 깨끗하게 재구성 가능

requirements.txt만 있으면 가상환경은 언제든 버리고 다시 만들 수 있습니다. 결과물(폴더)이 아니라 설명서(목록)를 관리하는 것 — 이것이 Python 프로젝트 공유의 표준 방식입니다.

- 패키지는 소스 코드에 포함되지 않는다 — 코드만 옮기면 ModuleNotFoundError
- .venv는 용량·경로·OS·버전에 묶여 있어 옮기는 대상이 아니다
- 공유하는 것: 소스 코드 + requirements.txt / 공유하지 않는 것: .venv
- 가상환경 = 결과물, requirements.txt = 재설치 설명서

→ 다음 강의 (11강): 이번 강의의 원칙을 터미널에서 실행합니다. 실제 프로젝트 폴더를 만들어 pip freeze로 requirements.txt를 생성하고, 새 폴더에 새 가상환경을 만들어 pip install -r로 같은 조합이 복원되는 것을 확인합니다.