
[Python] 가상환경 설정 정리
mac OS 기준으로 작성.
가상환경을 만드는 이유
모든 프로젝트를 한 환경에서 관리하게 되면, 의존성 문제에 직면한다. A project는 python 3.10으로 B project는 python 3.9로 진행해야 하는 상황이 대표적인 예시이다. 따라서 가상환경을 만들어 별도의 파이썬 런타임으로 관리하여 문제를 해결할 수 있다.
python에서는 내장 라이브러리 venv로 가상환경을 생성할 수 있다.
# 파이썬 가상환경 생성
python -m venv 가상환경이름
# 가상환경 활성화
source ./venv/bin/activate
# pip 패키지 설치
pip3 install 패키지이름
# pip로 설치된 package 관리
pip3 freeze > requirements.txt
# requirements로 설치된 package 설치
pip3 install -r requirements.txt
pip로 간단하게 jupyter lab(jupyter notebook)을 실행하는 방법.
설치
pip install jupyterlab(pip install notebook)
실행
jupyter lab(jupyter notebook)
pyenv
pyenv는 파이썬 매니저이다.
brew install pyenv
pyenv install을 통해 설치할 수 있다.
pyenv install --list // 설치 할 수 있는 목록을 확인하고,
pyenv install 설치하고싶은 버전
특정 버전의 python을 설치한뒤에, pyenv local 파이썬 버전
, pyenv global 파이썬버전
pipenv
Pipenv Installation — pipenv 2024.4.0 documentation
mac 환경을 사용한다면
brew install pipenv
pip를 이용한 설치
pip install pipenv
가상환경 프로젝트 설정 (with Python version)
pipenv --python 파이썬버전
가상환경 활성화
pipenv shell
가상환경을 활성화 하면 /Users/유저/.local/share/virtualenvs/pipenvtest-2f5th86d
같은 경로로 python 가상환경을 만든다.
파이썬 package 설치
pipenv install torch torchvision
파이썬 스크립트 파일 실행
pipenv run python main.py
pipenv는 pipenv lock
Pipfile.lock은 Pipfile에 선언된 의존성을 LOCK 파일로 변환한 후, 해당 버전을 고정하여 관리하는 파일!
Pipfile에는 의존성의 이름과 범위만 명시되어 있지만, Pipfile.lock에는 실제 설치할 수 있는 정확한 버전이 기록된다. 개발자들은 의존성 관리에 있어 안정성을 보장 받을 수 있으며, 다른 개발자나 시스템 관리자가 동일한 환경에서 프로젝트를 빌드할 수 있다.
Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
django = "*"
[dev-packages]
[requires]
python_version = "3.13"
Pipfile.lock
{
"_meta": {
"hash": {
"sha256": "1d824dfb7e1efaa95eefc090ec048bd1e901b57997b98d5b8319268f04f72176"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.13"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"asgiref": {
"hashes": [
"sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47",
"sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"
],
"markers": "python_version >= '3.8'",
"version": "==3.8.1"
},
"django": {
"hashes": [
"sha256:8b38a9a12da3ae00cb0ba72da985ec4b14de6345046b1e174b1fd7254398f818",
"sha256:c0fa0e619c39325a169208caef234f90baa925227032ad3f44842ba14d75234a"
],
"index": "pypi",
"markers": "python_version >= '3.10'",
"version": "==5.1.3"
},
"sqlparse": {
"hashes": [
"sha256:9e37b35e16d1cc652a2545f0997c1deb23ea28fa1f3eefe609eee3063c3b105f",
"sha256:e99bc85c78160918c3e1d9230834ab8d80fc06c59d03f8db2618f65f65dda55e"
],
"markers": "python_version >= '3.8'",
"version": "==0.5.2"
}
},
"develop": {}
}
Poetry
Poetry - Python dependency management and packaging made easy
poetry 설치
curl -sSL https://install.python-poetry.org | python3 -
* Mac에서 아래 Trace와 함께 실행이 되지 않는 경우에는
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)
버전에 맞게 open /Applications/Python\ 3.x/Install\ Certificates.command
를 터미널에서 실행.
마지막으로 export PATH="/Users/unanchoi/.local/bin:$PATH"
를 .zshrc
에 추가해준다.
poetry 프로젝트 설정
(이미 존재하는 python project에 poetry를 적용시키고 싶은 경우 에는 poetry init
)
poetry new 프로젝트이름

poetry로 프로젝트를 생성하면 위 구조로 프로젝트가 만들어진다.
poetry add 패키지이름.
poetry로 파이썬 파일 실행
poetry run python main.py
poetry.lock
파일로 package locking
poetry lock
UV로 관리
uv 설치
curl -LsSf <https://astral.sh/uv/install.sh> | sh
uv 사용 방법
# python 설치
uv python install {설치할 python 버전}
# 가상환경 생성
uv venv
# 가상환경을 생성할 파이썬 버전 지정
uv venv --python 사용할 버전
# 가상환경 활성화
source .venv/bin/activateuv venv --python 버전
# 패키지 설치
uv pip install 패키지명
# 스크립트 실행
uv run 파이썬스크립트.py
실습 코드
실습코드로 모든 가상환경에서 동작하는 것 확인.
import torch
import torchvision
from torchvision import datasets, transforms
import torch.nn as nn
# Define transformations for training and testing data
transform = transforms.Compose([transforms.ToTensor()])
# Load the training and test sets
trainset = datasets.CIFAR10(root='./data', train=True,
download=True, transform=transform)
testset = datasets.CIFAR10(root='./data', train=False,
download=True, transform=transform)
# Create data loaders
batch_size = 64
train_loader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
shuffle=True)
test_loader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
shuffle=False)
# Define the CNN model
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(nn.functional.relu(self.conv1(x)))
x = self.pool(nn.functional.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = nn.functional.relu(self.fc1(x))
x = nn.functional.relu(self.fc2(x))
x = self.fc3(x)
return x
model = Net()
# Loss function and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001)
for epoch in range(10): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
inputs, labels = data
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 200 == 199: # print every 200 mini-batches
print('[%d, %5d] loss: %.3f' %
(epoch + 1, i + 1, running_loss / 200))
running_loss = 0.0
print('Finished Training')
# Evaluate model
model.eval()
test_loss = 0
correct = 0with torch.no_grad():
for data in test_loader:
inputs, labels = data
outputs = model(inputs)
loss = criterion(outputs, labels)
test_loss += loss.item()
_, predicted = torch.max(outputs.data, 1)
correct += (predicted == labels).sum().item()
accuracy = correct / len(test_loader.dataset)
print('\\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\\n'.format(
test_loss / len(test_loader), correct, len(test_loader.dataset),
100. * accuracy))
uv로도 project를 구성할 수 있고,
uv init
을 사용하면 된다.
그러면 pyproject.toml
파일이 생긴다. 또한 uv add 패키지명
으로 package를 설치할 수 있고, uv.lock
파일로 관리된다.
부록
가상환경에 대한 내용은 아니지만 파이썬 세팅과 관련된 글이라 남겨두는 내용.
PEP 8 – Style Guide for Python Code | peps.python.org
프로젝트를 관리하다보면 각자 코드 작성하는 스타일이 다르기 때문에, 코드 통일성이 깨질 수 있다.
이런 상황들을 방지하기 위해서, Python에서는 style guide를 제공하고 있다.
하지만 style guide를 매번 지키면서 개발을 하는 것이 어렵기 때문에, 대부분의 언어들이 code formatter를 제공하고, python에서는 ruff라는 것이 존재한다.
ruff
ruff 공식문서
사용 방법은 매우 간단하다.
uv pip install ruff
ruff check
: ruff가 기존 code를 보고 check를 진행.
ruff format
: ruff가 code를 formatting.
black, flake8을 사용한 것보다 훨씬 속도가 빠르지만, 아직 custom으로 부터 자유롭지는 않은 것 같다.
pip
주피터 노트북으로 작성된 code에서 -qqq라는 option을 사용해서 package를 설치하는 code가 있어서 찾아봤다.
pip install
명령어에서-qqq
옵션은 출력 메시지를 최소화하는 데 사용됩니다.-q
옵션은 "quiet"의 줄임말로, 점점 더 조용하게 만드는 효과를 제공합니다.-qqq
는 그 중에서 가장 조용한 모드를 활성화하는데, 아래와 같은 정도로 작동합니다:-q
: INFO 수준 로그를 숨기고 WARNING과 ERROR만 표시합니다.-qq
: WARNING 로그도 숨기고 ERROR만 표시합니다.-qqq
: 모든 출력 로그를 숨겨, 완전히 조용한 모드로 작동합니다.

