article content thumbnail

[Python] 가상환경 설정 정리

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 init 시에 프로젝트 구조.

poetry로 프로젝트를 생성하면 위 구조로 프로젝트가 만들어진다.

poetry add 패키지이름.


poetry로 파이썬 파일 실행

poetry run python main.py


poetry.lock 파일로 package locking

poetry lock

UV로 관리

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: 모든 출력 로그를 숨겨, 완전히 조용한 모드로 작동합니다.


최신 아티클
Article Thumbnail
최윤한
|
2025.03.30
A-MEM: Agentic Memory for LLM Agents 리뷰
AI Agent의 기억 메모리 조직화 시스템 방법론
Article Thumbnail
최윤한
|
2025.03.08
IT 커뮤니티 SIPE 3기 운영진 마침표.
SIPE 운영진 활동 회고와 SIPE를 고민하는 하는 사람을 위한 후기와 추천글
(python) spotlight로 시각화 feature vector
최윤한
|
2025.03.02
(python) spotlight로 시각화 feature vector
Spotlight로 Feature Vector 시각화