2장. 개발 환경 준비
가상환경
한 건물에 식당 두 곳이 주방을 함께 쓴다고 해 봅시다. 한식당은 무쇠 솥을, 이탈리아 식당은 같은 자리에 파스타 냄비를 두고 싶어 합니다. 한쪽이 도구를 바꾸면 다른 쪽 요리가 틀어집니다. 그래서 식당마다 자기 조리대를 따로 둡니다. 파이썬도 같습니다. 과목마다 필요한 패키지와 판이 다르므로, 과목마다 따로 쓰는 패키지 상자인 가상환경을 만듭니다.
왼쪽 파랑 상자가 처음 설치한 원래 파이썬이고, 가운데 보라 상자와 오른쪽 하늘 상자가 과목마다 만든 가상환경입니다. 가상환경은 원래 파이썬을 바탕으로 만들지만, 패키지는 자기 폴더 안에만 들입니다. 여기서 건물의 큰 주방이 컴퓨터의 파이썬이고, 식당마다의 조리대가 .venv 입니다. 비유와 다른 점은, 조리대는 공간을 많이 차지하지만 가상환경은 폴더 하나라서 지우고 다시 만들기가 쉽다는 것입니다.
가상환경이 없을 때와 있을 때
| 견줄 것 | 가상환경 없이 | 가상환경으로 |
|---|---|---|
| 패키지를 두는 곳 | 컴퓨터 전체의 파이썬 한 곳 | 과목 폴더 안의 .venv |
| 다른 과목과 판이 다르면 | 나중에 설치한 판이 앞의 것을 덮는다 | 과목마다 따로 둔다 |
| 망가졌을 때 | 컴퓨터의 파이썬을 손봐야 한다 | .venv 폴더를 지우고 다시 만든다 |
| 다른 PC 에 옮길 때 | 무엇을 설치했는지 알기 어렵다 | requirements.txt 로 같은 상자를 다시 만든다 |
만들고 켜기
과목 폴더에서 VS Code 의 터미널(PowerShell)을 열고 실행합니다. 명령마다 무엇을 하는지 주석으로 달았습니다. 설치 순서 전체는 환경설정 쪽에도 있습니다.
# venv 모듈로 .venv 라는 이름의 가상환경 폴더를 만든다. -m = module(모듈을 프로그램처럼 실행)
python -m venv .venv
# 가상환경을 켠다. 켜지면 줄 앞에 (.venv) 가 붙는다. Activate = 켜다, .ps1 = PowerShell 스크립트 파일
.\.venv\Scripts\Activate.ps1
# 지금 쓰는 python 이 어디 있는지 본다. -c = command(뒤의 글을 코드로 바로 실행)
python -c "import sys; print(sys.prefix)"
# 가상환경을 끈다. deactivate = 끄다
deactivate| 명령과 옵션 | 원래 말 | 뜻 |
|---|---|---|
python -m venv .venv | module, virtual environment | venv 모듈을 실행해 .venv 폴더에 가상환경을 만든다 |
.\.venv\Scripts\Activate.ps1 | activate(켜다), PowerShell script | 이 터미널에서 .venv 의 python 과 pip 를 쓰게 한다 |
python -c "…" | command | 따옴표 안의 글을 파이썬 코드로 바로 실행한다 |
sys.prefix | prefix(앞에 붙는 것, 기준 폴더) | 지금 파이썬이 쓰는 환경의 폴더 |
deactivate | deactivate(끄다) | 가상환경을 끄고 컴퓨터의 파이썬으로 돌아간다 |
Activate.ps1 은 터미널 창 하나에만 효과가 있습니다. 새 터미널을 열면 다시 켭니다. VS Code 는 다음 절의 방법으로 인터프리터를 골라 두면 새 터미널을 열 때 저절로 켜 줍니다.
짧은 예시
지금 코드를 돌리는 파이썬이 가상환경 안의 것인지 코드로 확인합니다.
import sys
from pathlib import Path
# sys.prefix: 지금 쓰는 환경의 폴더, sys.base_prefix: 처음 설치한 원래 파이썬의 폴더
# 두 값이 다르면 가상환경 안에서 실행 중이다
print("가상환경 안인가:", sys.prefix != sys.base_prefix)
# 폴더의 전체 경로는 PC 마다 다르므로 마지막 이름만 찍는다
print("환경 폴더 이름:", Path(sys.prefix).name)가상환경 안인가: True
환경 폴더 이름: .venvTrue 와 .venv 가 나오면 과목의 가상환경에서 돌고 있습니다. False 가 나오면 컴퓨터 전체의 파이썬으로 실행한 것이니, 가상환경을 켜거나 VS Code 의 인터프리터를 다시 고릅니다.
코드가 의미하는 것
이 코드는 요리사가 "지금 내가 선 곳이 우리 식당의 조리대인가"를 확인하는 일을 흉내 냅니다. 두 폴더를 견주는 것과 환경 폴더의 이름을 찍는 것, 두 가지 동작입니다.
| 코드 | 하는 일 | 챗봇에서 뜻하는 것 |
|---|---|---|
sys.prefix | 지금 쓰는 환경의 폴더를 알려 준다 | 챗봇 코드가 어느 패키지 상자에서 langchain 과 openai 를 꺼내 쓰는지가 이 폴더로 정해집니다 |
sys.base_prefix | 처음 설치한 원래 파이썬의 폴더를 알려 준다 | 건물의 큰 주방에 해당합니다. 가상환경이 아니면 sys.prefix 와 같은 곳을 가리킵니다 |
sys.prefix != sys.base_prefix | 두 폴더가 다른지 견준다 | 다르면 과목의 조리대 위에 서 있다는 뜻입니다. 이 한 줄이 실습 1과 프로젝트 1의 가상환경 점검이 됩니다 |
Path(sys.prefix).name | 경로의 마지막 이름만 꺼낸다 | PC 마다 다른 앞부분은 화면에 남기지 않고, 그 상자가 .venv 인지만 봅니다 |
결과에서 읽을 것은 두 가지입니다.
- True 는 조리대가 따로라는 뜻입니다. 출력의
True는 이 코드가 원래 파이썬이 아닌 가상환경에서 돌았다는 것입니다. 여기에 설치한 패키지는 다른 과목에 섞이지 않습니다. - 이름이 `.venv` 입니다. 과목 폴더에 만든 바로 그 상자입니다. 다른 이름이 나오면 다른 과목의 가상환경을 켠 것입니다.
주의할 점
.venv폴더 안의 파일은 손으로 고치지 않습니다. 패키지는 늘pip로 넣고 뺍니다..venv는 남에게 보내지 않습니다. 크기가 크고, 다른 PC 에서는 경로가 달라 그대로 돌지 않습니다. 대신requirements.txt를 보냅니다.- PowerShell 이 "스크립트 실행이 막혀 있다"며
Activate.ps1을 거부하면 환경설정 쪽의 "자주 나는 오류" 표를 봅니다.