1. 사전 준비 (패키지 설치)
패키지 리스트 업데이# 패키지 리스트 업데이트 $ sudo apt update # python3-venv 패키지 설치 $ sudo apt install python3-venv
2. 가상환경 생성 (Create)
# 프로젝트 폴더 생성 및 이동 $ mkdir my_project $ cd my_project # 가상환경 생성 (폴더명: .venv) $ python3 -m venv .venv # venv 모듈을 실행, 격리된 가상환경을 생성, 그리고 그 가상환경의 이름은 .venv로 하겠다는 선언임. # 물론 폴더의 이름은 다르게 지어도 됨.
3. 가상환경 활성화 (Activate)
# 가상환경 활성화 robot@---$ source .venv/bin/activate (.venv) ---$ # 괄호안에 가상화 이름이 나타난다.
VS Code 자동 연동
터미널이 아닌 에디터 작업이 위주라면 별도의 툴 없이 VS Code 설정만으로 충분하다.
- 설정 방법: 폴더 내에
.venv이름으로 가상환경을 생성하면, VS Code가 폴더를 열 때 하단 인터프리터를 해당 가상환경으로 자동 지정한다.- 터미널 자동 활성화:
Setting > Python: Terminal Activate Env항목이 체크되어 있으면 새 터미널을 열 때마다 가상환경이 적용된 상태로 시작된다.
4. 검증 및 패키지 추가
# 파이썬 경로 확인 (시스템 경로가 아닌 .venv 내부여야 함) (.venv) ---$ which python3 # 출력 예시: /home/gk/my_project/.venv/bin/python # pip 업그레이드 (이제 업글 가능) pip install --upgrade pip # 필요한 패키지 설치 예시 (이제 pip를 가지고 자유롭게 외부 패키지를 가져와서 설치할 수 있다.) $ pip install flask beautifulsoup # 이제는 python을 입력해도 python3가 불려져 동작한다. $ python Python 3.12.3 (main, Nov 6 2025, 13:44:16) [GCC 13.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. Ctrl click to launch VS Code Native REPL >>>
5. 가상환경 비활성화 (Deactivate)
$ deactivate #추가로, 더이상 가상화가 필요없게 되면 그냥 .venv를 지우면 된다.
6. 가상환경 저장
가상환경을 저장하고 재조성하려면 항상 가상 환경 내에서 작업해야 한다. 목차 7 참조.
# 현재 환경의 패키지 목록 저장 $ pip freeze > requirements.txt # 다른 환경에서 동일한 패키지 설치 $ pip install -r requirements.txt
7. 복사된 가상환경을 다시 만들기
#가상화 생성 robot@kimsh:~/work/Robot-AI/Python/python3$ python3 -m venv .venv python3 -m venv .venv # requirements.txt 파일이 있는지 확인한다. robot@kimsh:~/work/Robot-AI/Python/python3$ ls module module1 requirements.org.txt requirements.txt robot1 src # requirements.txt를 만들어 왔다. # 가상환경 시작 robot@kimsh:~/work/Robot-AI/Python/python3$ source ./.venv/bin/activate # pip 업글 시작 (.venv) robot@kimsh:~/work/Robot-AI/Python/python3$ pip install --upgrade pip Requirement already satisfied: pip in ./.venv/lib/python3.12/site-packages (24.0) Collecting pip Downloading pip-25.3-py3-none-any.whl.metadata (4.7 kB) Downloading pip-25.3-py3-none-any.whl (1.8 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 11.1 MB/s eta 0:00:00 Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 24.0 Uninstalling pip-24.0: Successfully uninstalled pip-24.0 Successfully installed pip-25.3 # pip 업글 완료 # 기존에 만들었던 가상 환경을 그대로 복사해서 생성 (.venv) robot@kimsh:~/work/Robot-AI/Python/python3$ pip install -r ./requirements.txt Collecting beautifulsoup4==4.14.3 (from -r ./requirements.txt (line 1)) Using cached beautifulsoup4-4.14.3-py3-none-any.whl.metadata (3.8 kB) Collecting blinker==1.9.0 (from -r ./requirements.txt (line 2)) Using cached blinker-1.9.0-py3-none-any.whl.metadata (1.6 kB) Collecting click==8.3.1 (from -r ./requirements.txt (line 3)) Using cached click-8.3.1-py3-none-any.whl.metadata (2.6 kB) Collecting Flask==3.1.2 (from -r ./requirements.txt (line 4)) Using cached flask-3.1.2-py3-none-any.whl.metadata (3.2 kB) Collecting itsdangerous==2.2.0 (from -r ./requirements.txt (line 5)) Using cached itsdangerous-2.2.0-py3-none-any.whl.metadata (1.9 kB) Collecting Jinja2==3.1.6 (from -r ./requirements.txt (line 6)) Using cached jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB) Collecting MarkupSafe==3.0.3 (from -r ./requirements.txt (line 7)) Using cached markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.metadata (2.7 kB) Collecting soupsieve==2.8 (from -r ./requirements.txt (line 8)) Using cached soupsieve-2.8-py3-none-any.whl.metadata (4.6 kB) Collecting typing_extensions==4.15.0 (from -r ./requirements.txt (line 9)) Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB) Collecting Werkzeug==3.1.4 (from -r ./requirements.txt (line 10)) Using cached werkzeug-3.1.4-py3-none-any.whl.metadata (4.0 kB) Using cached beautifulsoup4-4.14.3-py3-none-any.whl (107 kB) Using cached blinker-1.9.0-py3-none-any.whl (8.5 kB) Using cached click-8.3.1-py3-none-any.whl (108 kB) Using cached flask-3.1.2-py3-none-any.whl (103 kB) Using cached itsdangerous-2.2.0-py3-none-any.whl (16 kB) Using cached jinja2-3.1.6-py3-none-any.whl (134 kB) Using cached markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (22 kB) Using cached soupsieve-2.8-py3-none-any.whl (36 kB) Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB) Using cached werkzeug-3.1.4-py3-none-any.whl (224 kB) Installing collected packages: typing_extensions, soupsieve, MarkupSafe, itsdangerous, click, blinker, Werkzeug, Jinja2, beautifulsoup4, Flask Successfully installed Flask-3.1.2 Jinja2-3.1.6 MarkupSafe-3.0.3 Werkzeug-3.1.4 beautifulsoup4-4.14.3 blinker-1.9.0 click-8.3.1 itsdangerous-2.2.0 soupsieve-2.8 typing_extensions-4.15.0 # 기존에 만들었던 가상 환경을 그대로 복사해서 생성 완료 (.venv) robot@kimsh:~/work/Robot-AI/Python/python3$