LangChain 챗봇2장 · 개발 환경 준비3 / 20← 이전목차다음 →MetaContents

2장. 개발 환경 준비

가상환경

한 건물에 식당 두 곳이 주방을 함께 쓴다고 해 봅시다. 한식당은 무쇠 솥을, 이탈리아 식당은 같은 자리에 파스타 냄비를 두고 싶어 합니다. 한쪽이 도구를 바꾸면 다른 쪽 요리가 틀어집니다. 그래서 식당마다 자기 조리대를 따로 둡니다. 파이썬도 같습니다. 과목마다 필요한 패키지와 판이 다르므로, 과목마다 따로 쓰는 패키지 상자인 가상환경을 만듭니다.

컴퓨터의 파이썬, 이 과목의 .venv, 다른 과목의 .venv 세 폴더를 나란히 놓고 서로 섞이지 않는다고 적은 비교 그림

왼쪽 파랑 상자가 처음 설치한 원래 파이썬이고, 가운데 보라 상자와 오른쪽 하늘 상자가 과목마다 만든 가상환경입니다. 가상환경은 원래 파이썬을 바탕으로 만들지만, 패키지는 자기 폴더 안에만 들입니다. 여기서 건물의 큰 주방이 컴퓨터의 파이썬이고, 식당마다의 조리대가 .venv 입니다. 비유와 다른 점은, 조리대는 공간을 많이 차지하지만 가상환경은 폴더 하나라서 지우고 다시 만들기가 쉽다는 것입니다.

가상환경이 없을 때와 있을 때

견줄 것가상환경 없이가상환경으로
패키지를 두는 곳컴퓨터 전체의 파이썬 한 곳과목 폴더 안의 .venv
다른 과목과 판이 다르면나중에 설치한 판이 앞의 것을 덮는다과목마다 따로 둔다
망가졌을 때컴퓨터의 파이썬을 손봐야 한다.venv 폴더를 지우고 다시 만든다
다른 PC 에 옮길 때무엇을 설치했는지 알기 어렵다requirements.txt 로 같은 상자를 다시 만든다

만들고 켜기

과목 폴더에서 VS Code 의 터미널(PowerShell)을 열고 실행합니다. 명령마다 무엇을 하는지 주석으로 달았습니다. 설치 순서 전체는 환경설정 쪽에도 있습니다.

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 .venvmodule, virtual environmentvenv 모듈을 실행해 .venv 폴더에 가상환경을 만든다
.\.venv\Scripts\Activate.ps1activate(켜다), PowerShell script이 터미널에서 .venv 의 python 과 pip 를 쓰게 한다
python -c "…"command따옴표 안의 글을 파이썬 코드로 바로 실행한다
sys.prefixprefix(앞에 붙는 것, 기준 폴더)지금 파이썬이 쓰는 환경의 폴더
deactivatedeactivate(끄다)가상환경을 끄고 컴퓨터의 파이썬으로 돌아간다

Activate.ps1 은 터미널 창 하나에만 효과가 있습니다. 새 터미널을 열면 다시 켭니다. VS Code 는 다음 절의 방법으로 인터프리터를 골라 두면 새 터미널을 열 때 저절로 켜 줍니다.

짧은 예시

지금 코드를 돌리는 파이썬이 가상환경 안의 것인지 코드로 확인합니다.

Python
import sys
from pathlib import Path

# sys.prefix: 지금 쓰는 환경의 폴더, sys.base_prefix: 처음 설치한 원래 파이썬의 폴더
# 두 값이 다르면 가상환경 안에서 실행 중이다
print("가상환경 안인가:", sys.prefix != sys.base_prefix)
# 폴더의 전체 경로는 PC 마다 다르므로 마지막 이름만 찍는다
print("환경 폴더 이름:", Path(sys.prefix).name)
출력
가상환경 안인가: True
환경 폴더 이름: .venv

True 와 .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 을 거부하면 환경설정 쪽의 "자주 나는 오류" 표를 봅니다.
← 이전 절2장 · 용어 짚고 가기다음 절 →2장 · pip 와 패키지