2025년 3월 4일 화요일

Python-dotenv로 환경 변수 관리하기


 

# Python-dotenv로 환경 변수 관리하기

환경 변수 관리는 모든 개발 프로젝트에서 중요한 부분입니다. 특히 API 키, 데이터베이스 비밀번호와 같은 민감한 정보를 안전하게 관리하기 위해서는 적절한 도구가 필요합니다. Python-dotenv는 이러한 환경 변수를 효율적으로 관리할 수 있게 도와주는 파이썬 라이브러리입니다. 이 도구를 사용하면 `.env` 파일에 환경 변수를 저장하고 애플리케이션에서 쉽게 불러올 수 있어, 개발과 배포 과정을 훨씬 단순화할 수 있습니다.

개발자로서 환경 변수를 하드코딩하거나 여러 설정 파일을 관리하는 번거로움을 겪어보셨나요? 또는 팀 프로젝트에서 각기 다른 개발 환경을 일관되게 유지하는 어려움을 경험해보셨나요? Python-dotenv는 이러한 문제를 해결하고 코드의 보안성과 유지보수성을 향상시키는 데 큰 도움이 됩니다.

이 글에서는 Python-dotenv의 기본 개념부터 실제 프로젝트에 적용하는 방법까지 단계별로 알아보겠습니다. 간단한 예제와 함께 이 도구의 장점을 충분히 활용할 수 있는 방법을 소개해 드리겠습니다.

## 🔍 Python-dotenv란 무엇인가?

Python-dotenv는 `.env` 파일에서 환경 변수를 로드하고 관리하는 파이썬 패키지입니다. 이 라이브러리의 주요 목적은 애플리케이션 설정과 민감한 정보를 코드와 분리하여 관리하는 것입니다.

일반적으로 환경 변수는 운영체제 수준에서 설정되는데, Python-dotenv를 사용하면 프로젝트 디렉토리 내의 `.env` 파일에 이러한 변수들을 정의하고 파이썬 애플리케이션에서 쉽게 접근할 수 있습니다.

```python
# 운영체제 환경 변수 설정 없이도 .env 파일의 값을 가져올 수 있습니다
DATABASE_URL=postgresql://user:password@localhost/dbname
API_KEY=your_secret_api_key
DEBUG=True
```

## ⚙️ 설치 및 기본 사용법

Python-dotenv는 pip를 사용하여 쉽게 설치할 수 있습니다:

```bash
pip install python-dotenv
```

설치 후에는 다음과 같이 간단하게 사용할 수 있습니다:

## 🚀 Python-dotenv의 주요 기능과 활용법

### 1. 다양한 환경별 설정 관리 🌍

개발, 테스트, 프로덕션 등 다양한 환경에서 서로 다른 설정을 사용해야 할 때 Python-dotenv가 큰 도움이 됩니다. 각 환경별로 다른 `.env` 파일을 만들어 관리할 수 있습니다.

```
# .env.development
DEBUG=True
DATABASE_URL=sqlite:///dev.db

# .env.production
DEBUG=False
DATABASE_URL=postgresql://user:password@production-server/dbname
```

이렇게 환경별로 다른 파일을 로드하는 방법:

```python
import os
from dotenv import load_dotenv

# 환경에 따라 다른 .env 파일 로드
env_name = os.environ.get("ENV_NAME", "development")
load_dotenv(f".env.{env_name}")

# 이제 적절한 환경 변수가 로드됩니다
debug = os.environ.get("DEBUG")
```

### 2. 중첩된 변수 지원 ⛓️

Python-dotenv는 `.env` 파일 내에서 다른 변수를 참조하는 중첩 변수를 지원합니다:

```
# .env 파일
BASE_URL=https://api.example.com
API_VERSION=v1
API_ENDPOINT=${BASE_URL}/${API_VERSION}
```

이 기능을 사용하면 반복적인 설정을 줄이고 더 체계적으로 환경 변수를 관리할 수 있습니다.

### 3. 파이썬 프레임워크와의 통합 예제 🔄

Flask나 Django와 같은 웹 프레임워크에서 Python-dotenv를 활용하는 예제를 살펴보겠습니다:

## 🔒 보안과 버전 관리에서의 모범 사례

Python-dotenv를 사용할 때 몇 가지 중요한 보안 사항과 버전 관리 모범 사례가 있습니다:

### 민감한 정보 보호 ✅

- ✔️ `.env` 파일은 항상 `.gitignore`에 추가하여 버전 관리에서 제외
- ✔️ 대신 `.env.example` 파일을 만들어 필요한 변수 형식을 공유
- ✔️ 프로덕션 환경의 키는 안전한 비밀 저장소 또는 클라우드 서비스의 환경 변수 관리 도구 사용

```
# .gitignore 파일에 추가
.env
.env.*
!.env.example
```

```
# .env.example 파일 (실제 값 없이 형식만 공유)
DATABASE_URL=postgresql://user:password@host/dbname
API_KEY=your_api_key_here
DEBUG=True
```

## 🔧 실전 활용 사례: 웹 크롤링 프로젝트

개인적으로 웹 크롤링 프로젝트를 진행하면서 Python-dotenv를 처음 접하게 되었습니다. 여러 API 키와 데이터베이스 접속 정보를 관리해야 했는데, 이를 코드에 하드코딩하는 것은 보안상 위험했고, 팀원들과 공유하기도 어려웠습니다.

Python-dotenv를 도입한 후에는 다음과 같은 이점을 경험했습니다:

1. 개발자마다 자신의 API 키를 `.env` 파일에 별도로 관리할 수 있었습니다.
2. 코드 리뷰 과정에서 민감한 정보가 노출되지 않았습니다.
3. 테스트 환경과 프로덕션 환경을 쉽게 전환할 수 있었습니다.

간단한 웹 크롤링 예제로 Python-dotenv의 실제 사용법을 알아보겠습니다:

```python
# .env 파일 내용:
# API_KEY=your_api_key_here
# USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
# PROXY_URL=http://proxy.example.com:8080
# MAX_REQUESTS=100
# SAVE_DIRECTORY=./data

# scraper.py
import os
import requests
from dotenv import load_dotenv, find_dotenv

# 자동으로 .env 파일 찾아 로드
load_dotenv(find_dotenv())

def get_api_data(endpoint):
    """API에서 데이터를 가져오는 함수"""
    headers = {
        'User-Agent': os.environ.get('USER_AGENT'),
        'Authorization': f"Bearer {os.environ.get('API_KEY')}"
    }
    
    proxies = None
    if os.environ.get('PROXY_URL'):
        proxies = {
            'http': os.environ.get('PROXY_URL'),
            'https': os.environ.get('PROXY_URL')
        }
    
    response = requests.get(
        endpoint,
        headers=headers,
        proxies=proxies
    )
    
    return response.json()

def save_data(data, filename):
    """데이터를 파일로 저장하는 함수"""
    save_dir = os.environ.get('SAVE_DIRECTORY', './data')
    
    # 디렉토리가 없으면 생성
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
        
    file_path = os.path.join(save_dir, filename)
    
    with open(file_path, 'w') as f:
        f.write(str(data))
    
    return file_path

if __name__ == "__main__":
    # 환경 변수 확인 및 기본값 설정
    max_requests = int(os.environ.get('MAX_REQUESTS', 10))
    
    print(f"Starting web scraping with {max_requests} max requests")
    print(f"Using API key: {os.environ.get('API_KEY')[:5]}...")
    
    # API에서 데이터 가져오기
    data = get_api_data("https://api.example.com/data")
    
    # 데이터 저장
    file_path = save_data(data, "scraped_data.json")
    print(f"Data saved to {file_path}")
```

## 🌟 Python-dotenv의 고급 기법

Python-dotenv를 더 효과적으로 활용할 수 있는 몇 가지 고급 기법을 알아보겠습니다:

### 1. 커맨드라인에서 환경 변수 오버라이드 ⚡

Python-dotenv는 `.env` 파일의 환경 변수보다 이미 설정된 OS 환경 변수를 우선시합니다. 이를 활용하면 특정 상황에서 임시로 환경 변수를 오버라이드할 수 있습니다:

```bash
# 일시적으로 다른 데이터베이스 사용
DATABASE_URL=sqlite:///test.db python app.py
```

### 2. .env 파일 위치 커스터마이징 ⚡

프로젝트 구조에 따라 `.env` 파일의 위치를 지정할 수 있습니다:

```python
from dotenv import load_dotenv
import os

# 특정 경로의 .env 파일 로드
load_dotenv("/path/to/project/.env")

# 또는 상대 경로 사용
load_dotenv(os.path.join(os.path.dirname(__file__), "..", ".env"))
```

### 3. 환경 변수 재정의 방지 ⚡

이미 설정된 환경 변수를 `.env` 파일로 덮어쓰지 않게 하려면 `override=False` 옵션을 사용합니다:

```python
from dotenv import load_dotenv

# 이미 존재하는 환경 변수는 유지
load_dotenv(override=False)
```

## 📊 마무리: Python-dotenv로 환경 변수 관리 시작하기

Python-dotenv는 간단하지만 강력한 도구로, 파이썬 프로젝트에서 환경 변수를 효율적으로 관리할 수 있게 해줍니다. 특히 민감한 정보를 코드에서 분리하고, 여러 개발 환경에서 일관된 설정을 유지하는 데 큰 도움이 됩니다.

이 글에서 소개한 기본 개념과 예제를 통해 Python-dotenv를 프로젝트에 도입하는 데 필요한 지식을 얻으셨기를 바랍니다. 소규모 개인 프로젝트부터 대규모 팀 프로젝트까지, Python-dotenv는 환경 변수 관리를 단순화하고 보안을 강화하는 데 기여할 것입니다.

프로젝트에 Python-dotenv를 도입할 때는 다음 단계를 따라보세요:

1. `pip install python-dotenv`로 설치
2. 프로젝트 루트에 `.env` 파일 생성
3. `.gitignore`에 `.env` 파일 추가
4. 예제 형식을 보여주는 `.env.example` 파일 생성
5. 코드에 `load_dotenv()`를 추가하여 환경 변수 로드

이러한 단계를 통해 코드의 유지보수성과 보안성을 한 단계 높일 수 있을 것입니다. 환경 변수 관리를 체계화하여 개발 과정이 더욱 순탭해지길 바랍니다!



2025년 2월 26일 수요일

Python Poetry를 사용한 파이썬 패키지 개발

🚀 Poetry로 시작하는 프로페셔널 파이썬 패키지 개발: 실전 가이드 2024

안녕하세요! 지난번 PEP 517 포스팅에 많은 관심을 보내주셔서 감사합니다. 오늘은 많은 분들이 요청하신 Poetry를 사용한 실전 패키지 개발 가이드를 준비했습니다. 제가 실제 프로젝트에서 Poetry를 도입하면서 겪은 시행착오와 깨달음을 모두 담아보았습니다. 특히 처음 Poetry를 시작하시는 분들이 꼭 알아야 할 내용들을 중심으로 구성했으니, 끝까지 함께해 주세요!

🎯 Poetry가 필요한 순간: 실제 사례로 알아보기

저는 얼마 전 회사에서 데이터 분석 파이프라인을 개발하는 프로젝트를 맡았습니다. 팀원들과 함께 작업하면서 가장 큰 고민은 "서로 다른 환경에서 어떻게 동일한 결과를 보장할 수 있을까?"였죠. requirements.txt를 사용했지만, 버전 충돌과 환경 불일치 문제가 계속 발생했습니다.

Poetry를 도입한 후, 이런 문제들이 말끔히 해결되었습니다. 특히 인상적이었던 것은 새로운 팀원이 합류했을 때의 온보딩 시간이 대폭 줄었다는 거예요. 단순히 poetry install 한 줄로 모든 설정이 끝났으니까요!

💫 Poetry 설치와 프로젝트 시작하기

먼저 Poetry를 설치하는 방법부터 알아볼까요?

# Poetry 설치
curl -sSL https://install.python-poetry.org | python3 -

# 새 프로젝트 시작
poetry new my-awesome-package
cd my-awesome-package

# 기존 프로젝트에 Poetry 적용
poetry init

🛠️ Poetry의 핵심 기능 마스터하기

의존성 관리

[tool.poetry.dependencies]
python = "^3.8"
requests = "^2.28.0"
pandas = ">=1.4.0"

[tool.poetry.dev-dependencies]
pytest = "^7.1.1"
black = "^22.3.0"

가상환경 관리

# 가상환경 생성 및 활성화
poetry shell

# 의존성 설치
poetry install

# 새 패키지 추가
poetry add requests

📊 Poetry vs 다른 패키지 관리 도구 비교

기능 Poetry Pip+venv Pipenv
의존성 해결 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐
설치 속도 ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐
사용 편의성 ⭐⭐⭐⭐⭐ ⭐⭐ ⭐⭐⭐
러닝커브 ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐

✨ Poetry 실전 활용 팁

프로젝트 구조 최적화

✔️ src 레이아웃 사용하기

my-project/
├── pyproject.toml
├── README.md
├── src/
│   └── my_package/
│       ├── __init__.py
│       └── main.py
└── tests/
    └── test_main.py

패키지 배포 준비

✔️ 빌드 및 배포 명령어

# 패키지 빌드
poetry build

# PyPI에 배포
poetry publish

🚨 자주 발생하는 문제와 해결방법

문제 해결 체크리스트

  • ✔️ 가상환경이 제대로 활성화되지 않을 때
    poetry env list
    poetry env remove python
    poetry install
    
  • ✔️ 의존성 충돌 발생 시
    poetry update --lock
    
  • ✔️ 패키지 퍼블리시 오류
    poetry config pypi-token.pypi your-token
    

마치며

Poetry는 현대 파이썬 개발의 필수 도구로 자리잡았습니다. 특히 팀 프로젝트에서 일관된 개발 환경을 유지하고 싶다면, Poetry는 최고의 선택이 될 것입니다. 이 가이드가 여러분의 패키지 개발 여정에 도움이 되었기를 바랍니다.

궁금하신 점이나 공유하고 싶은 경험이 있다면 댓글로 남겨주세요! 😊

2025년 2월 24일 월요일

Python PEP 517로 알아보는 파이썬 패키징

🚀 PEP 517로 알아보는 현대적 파이썬 패키징의 모든 것: 초보자도 이해하기 쉬운 가이드

안녕하세요! 오늘은 파이썬 개발자라면 한 번쯤 마주치게 되는 패키징 시스템, 특히 PEP 517에 대해 알아보려고 합니다. "setup.py가 뭐죠?", "왜 패키지 빌드가 자꾸 실패하나요?" 이런 고민을 해보신 적 있으신가요? 걱정 마세요. 오늘 포스팅을 통해 현대적인 파이썬 패키징의 세계로 여러분을 초대합니다.

🤔 왜 PEP 517이 필요했을까?

제가 처음 파이썬 패키징을 접했을 때의 이야기로 시작해볼까요? 몇 년 전, 저는 작은 유틸리티 라이브러리를 만들어 PyPI에 배포하려 했습니다. setup.py를 작성하고, 빌드하고... 그런데 이게 웬걸, 로컬에서는 잘 돌아가는데 다른 환경에서는 제대로 설치가 안 되는 거예요!

알고 보니 setup.py가 실행될 때 예상치 못한 코드가 실행되고 있었고, 시스템 파이썬 환경이 오염되는 문제도 있었습니다. 이런 문제들을 해결하기 위해 PEP 517이 등장했답니다.

📦 PEP 517이 가져온 혁신적인 변화

이제 패키징은 정말 간단해졌습니다! 예전에는 이런 복잡한 setup.py를 작성해야 했는데요:

from setuptools import setup, find_packages

setup(
    name="my-complex-package",
    version="0.1.0",
    packages=find_packages(),
    install_requires=[
        "requests>=2.22.0",
        "pandas>=1.0.0",
    ],
    # ... 더 많은 복잡한 설정들
)

PEP 517 덕분에 이제는 깔끔한 pyproject.toml로 대체할 수 있습니다:

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry]
name = "my-simple-package"
version = "0.1.0"
description = "A sample package"

🔍 주요 빌드 도구 비교

현대 파이썬 패키징 도구들을 한눈에 비교해볼까요?

도구 특징 추천 사용 사례
Poetry 의존성 관리가 깔끔함 실무 프로젝트
Flit 설정이 매우 간단함 작은 라이브러리
PDM Poetry의 대안, 가볍고 빠름 중소규모 프로젝트
Hatch 최신 기능 지원 신규 프로젝트

⚡ PEP 517 도입의 장단점

✔️ 장점

  • 환경 격리로 안전한 빌드1
  • 명확한 의존성 관리
  • 재현 가능한 빌드 환경
  • 다양한 빌드 도구 선택 가능

단점

  • 기존 프로젝트 마이그레이션 필요
  • 새로운 도구 학습 곡선
  • 일부 레거시 도구와의 호환성 이슈

🎯 실전 활용 팁

처음 PEP 517을 도입할 때 이런 팁들이 도움될 거예요:

  1. ✨ 새 프로젝트는 Poetry나 PDM으로 시작하기
  2. pyproject.toml을 버전 관리에 포함하기
  3. ✨ 빌드 의존성은 최소한으로 유지하기
  4. ✨ 가상환경 사용은 필수!

마치며

파이썬 패키징의 새로운 표준, PEP 517은 개발자들의 삶을 한결 편하게 만들어주고 있습니다. 특히 처음 파이썬 패키지를 만들어보시는 분들이라면, PEP 517 기반의 현대적인 도구들을 사용하시는 것을 추천드립니다.

2025년 2월 22일 토요일

Python ByteIO활용 하는 메모리 최적화 방법

🚀 BytesIO로 메모리를 최적화하는 놀라운 방법: 파이썬 개발자를 위한 완벽 가이드

안녕하세요! 오늘은 파이썬 개발에서 메모리를 최대한 활용하는, BytesIO에 대해 자세히 알아보려고 합니다. 대용량 데이터 처리나 웹 애플리케이션 개발을 하다 보면 메모리 사용량이 늘어나 성능 저하를 경험하신 적 있으시죠? BytesIO를 활용하면 이런 문제를 효과적으로 해결할 수 있습니다. 특히 임시 파일 생성 없이 메모리 내에서 데이터를 효율적으로 다룰 수 있어, 개발자들 사이에서 "메모리 절약의 비법"으로 불리고 있죠.

💡 BytesIO란 무엇인가?

BytesIO는 Python의 io 모듈에서 제공하는 특별한 클래스입니다. 실제 파일처럼 동작하지만, 디스크에 파일을 만들지 않고 메모리 상에서 바이트 데이터를 처리할 수 있게 해주는 마법 같은 도구입니다.

🎯 실제 현장에서의 BytesIO 활용 사례

얼마 전 대규모 로그 처리 시스템을 개발하던 중 겪었던 재미있는 경험을 공유해드리겠습니다. 매일 수백 GB의 로그 데이터를 처리해야 했는데, 기존 방식으로는 임시 파일이 너무 많이 생성되어 디스크 공간이 부족해지는 문제가 발생했습니다.

# 기존 방식의 문제점
for log in large_logs:
    with open('temp_log.txt', 'w') as f:
        f.write(log)
    # 로그 처리
    # 임시 파일이 계속 생성되어 디스크 공간 부족!

BytesIO를 도입한 후:

from io import BytesIO

for log in large_logs:
    buffer = BytesIO()
    buffer.write(log.encode())
    buffer.seek(0)
    # 로그 처리
    buffer.close()
    # 임시 파일 없이 메모리에서 처리 완료!

📊 기존 방식 vs BytesIO 비교

특징 일반 파일 I/O BytesIO
디스크 사용 높음 없음
처리 속도 느림 빠름
메모리 효율성 낮음 높음
자원 관리 복잡함 간단함

⚡ BytesIO 사용의 장단점

장점: ✔️ 디스크 I/O 없이 빠른 처리 가능 ✔️ 메모리 효율적 사용 ✔️ 임시 파일 생성 없음 ✔️ 멀티스레드 환경에서 안전

단점: ❌ 대용량 데이터 처리 시 메모리 관리 필요 ❌ 영구 저장이 필요한 경우 추가 작업 필요

🔍 마치며

BytesIO는 파이썬 개발자의 필수 도구입니다. 특히 웹 애플리케이션이나 데이터 처리 시스템을 개발할 때 메모리 최적화의 강력한 해결책이 될 수 있습니다. 지금까지 소개한 방법들을 적용하면서, 여러분의 프로젝트에 가장 적합한 방식을 찾아보시기 바랍니다.


2023년 12월 3일 일요일

Python Django Quick-start

Django Quick-start

Django는 파이썬에서 사용할 수 있는 강력하고 유연한 웹 프레임워크입니다. Django를 설치하고 간단한 예제 프로젝트를 만드는 단계를 아래에 설명하겠습니다.

Django 설치

가상 환경 생성 및 활성화 (선택사항)

가상 환경을 사용하면 프로젝트별로 독립적인 파이썬 환경을 만들 수 있어, 여러 프로젝트에서 서로 다른 패키지 버전을 관리하기가 편리합니다.

python -m venv myvenv
  source myvenv/bin/activate  # Linux나 MacOS에서
  myvenv\Scripts\activate  # Windows에서

파이썬에 내장된 venv 모듈을 사용하여 새로운 가상 환경을 생성하고, 해당 환경을 활성화합니다. 활성화 후에는 해당 가상 환경 내에서 패키지 설치 및 관리가 이루어집니다.

Django 설치

pip를 사용하여 Django를 설치합니다.

pip install django

pip는 파이썬의 패키지 관리자로, 파이썬 라이브러리를 쉽게 설치하고 관리할 수 있게 해줍니다.

간단한 Django 프로젝트 생성

프로젝트 생성

django-admin 도구를 사용하여 새 프로젝트를 생성합니다.

django-admin startproject myproject
   cd myproject

Django 프로젝트의 기본 구조를 생성합니다. 프로젝트는 사이트의 전체 응용 프로그램을 포함합니다.django-admin 명령어를 사용해 새 프로젝트를 생성합니다. 이 명령어는 Django 프로젝트의 기본 폴더 구조와 파일을 설정합니다.

애플리케이션 생성

Django 프로젝트 내에서, 특정 기능을 담당하는 애플리케이션을 생성할 수 있습니다.

python manage.py startapp myapp

Django에서 애플리케이션은 프로젝트의 구성 요소로, 일련의 기능을 그룹화합니다. manage.py 스크립트와 startapp 명령어를 사용하여 새 애플리케이션을 생성합니다.

모델 정의

myapp/models.py 파일을 열고 간단한 모델을 정의합니다. 예를 들어, 간단한 Post 모델을 만들어봅시다.

from django.db import models

   class Post(models.Model):
       title = models.CharField(max_length=100)
       content = models.TextField()

       def __str__(self):
           return self.title

여기서는 데이터베이스 구조를 정의합니다. Django에서 모델은 데이터베이스의 테이블에 해당하며, 각 필드는 테이블의 컬럼입니다. models.py 파일에 클래스로 모델을 정의합니다. 이 클래스는 django.db.models.Model을 상속받아 Django ORM을 통해 데이터베이스와 상호작용합니다.

모델을 Admin 사이트에 등록

myapp/admin.py 파일을 열고 Post 모델을 등록합니다.

from django.contrib import admin
  from .models import Post

  admin.site.register(Post)

생성한 모델을 Django의 관리자 사이트에서 관리할 수 있도록 합니다. admin.py 파일에 모델을 등록합니다. 이렇게 하면 Django의 관리자 인터페이스에서 모델을 추가, 수정, 삭제할 수 있습니다.

데이터베이스 마이그레이션

모델 변경 사항을 데이터베이스에 적용하기 위해 마이그레이션을 실행합니다.

python manage.py makemigrations
  python manage.py migrate

모델의 변경사항을 데이터베이스에 적용합니다. makemigrations 명령어로 모델 변경 사항에 대한 마이그레이션 파일을 생성하고, migrate 명령어로 이를 데이터베이스에 적용합니다.

개발 서버 실행

Django의 내장 개발 서버를 실행합니다.

python manage.py runserver

이제 브라우저에서 http://127.0.0.1:8000/로 접속하면 Django 개발 서버가 실행 중인 것을 볼 수 있습니다.

runserver 명령어를 사용하여 개발 서버를 시작합니다. 이 서버는 개발 중에 애플리케이션을 테스트하기 위한 것입니다

Admin 사이트 접속

Django는 기본적으로 관리자 사이트를 제공합니다. 관리자 계정을 만들어 접속해봅시다.

python manage.py createsuperuser

관리자 계정을 만든 후, http://127.0.0.1:8000/admin로 접속하여 로그인할 수 있습니다. 여기서 Post 모델을 관리할 수 있습니다.

이러한 단계를 통해 기본적인 Django 프로젝트를 설정하고, 간단한 모델을 만들어 Admin 사이트에서 관리할 수 있게 되었습니다. Django는 이보다 훨씬 다양하고 복잡한 기능을 제공하므로, 웹 애플리케이션의 요구사항에 맞게 추가적인 개발을 진행할 수 있습니다.



2023년 12월 2일 토요일

Pytorch 설치 및 간단한 예제

 

Pytorch 설치 및 간단한 예제

PyTorch는 딥 러닝 모델을 구축하고 학습하기 위한 인기 있는 라이브러리입니다. 여기 간단한 PyTorch 예제를 테스트 해봅니다. 이 예제에서는 기본적인 신경망을 구성하고, 간단한 데이터셋에 대해 이 신경망을 학습시키는 과정을 보여줍니다.

예제: 기본적인 신경망 학습

1. 필요한 라이브러리 임포트

import torch
import torch.nn as nn
import torch.optim as optim

여기서는 PyTorch 관련 주요 라이브러리를 임포트합니다.

  • torch: PyTorch의 기본 모듈로, 텐서 연산 및 기타 기본 기능을 제공합니다.
  • torch.nn: 신경망을 구축하는 데 필요한 모듈 및 클래스를 제공합니다.
  • torch.optim: 최적화 알고리즘(예: SGD, Adam)을 포함하고 있으며, 이를 통해 모델의 가중치를 업데이트합니다.

2. 신경망 모델 정의

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 입력층, 은닉층, 출력층 정의
        self.fc1 = nn.Linear(3, 3)  # 3개 입력 노드에서 3개 은닉 노드로
        self.fc2 = nn.Linear(3, 1)  # 3개 은닉 노드에서 1개 출력 노드로

    def forward(self, x):
        x = torch.relu(self.fc1(x))  # ReLU 활성화 함수 적용
        x = self.fc2(x)
        return x

# 모델 인스턴스 생성
net = Net()

사용자 정의 신경망 모델을 정의합니다. nn.Module을 상속받아서 모델을 정의하며, __init__ 메서드에서 모델의 레이어를 정의하고 forward 메서드에서 데이터가 모델을 통과할 때 수행할 계산을 정의합니다.

3. 손실 함수와 최적화 기법 선택

criterion = nn.MSELoss()  # 평균 제곱 오차 손실 함수
optimizer = optim.SGD(net.parameters(), lr=0.01)  # 확률적 경사 하강법 최적화
  • criterion: 모델의 출력과 실제 타겟 간의 차이를 계산하는 손실 함수를 정의합니다. 여기서는 평균 제곱 오차(MSE)를 사용합니다.
  • optimizer: 모델의 가중치를 업데이트하는 방법을 정의합니다. 여기서는 확률적 경사 하강법(SGD)과 학습률(Learning rate) 0.01을 사용합니다.

4. 학습 데이터 준비

# 간단한 예시 데이터셋
inputs = torch.tensor([[1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [1.0, 2.0, 3.0]])
targets = torch.tensor([[1.0], [2.0], [3.0]])

이 단계에서는 학습에 사용할 입력 데이터(inputs)와 해당 타겟 레이블(targets)을 정의합니다. 이 데이터는 모델을 훈련시키는 데 사용됩니다.

5. 학습 과정

for epoch in range(500):  # 에포크 수 설정
    optimizer.zero_grad()   # 그래디언트 버퍼 초기화
    outputs = net(inputs)   # 입력에 대한 예측값 계산
    loss = criterion(outputs, targets)  # 손실 계산
    loss.backward()  # 역전파 수행
    optimizer.step()  # 가중치 업데이트

    if (epoch+1) % 50 == 0:  # 매 50 에포크마다 손실 출력
        print(f'Epoch [{epoch+1}/500], Loss: {loss.item():.4f}')

이 부분은 모델을 학습시키는 과정입니다. 각 에포크마다 다음의 단계를 수행합니다:

  • optimizer.zero_grad(): 이전 에포크에서 계산된 그래디언트를 초기화합니다.
  • outputs = net(inputs): 현재 모델을 사용하여 입력 데이터에 대한 예측을 수행합니다.
  • loss = criterion(outputs, targets): 손실 함수를 사용하여 예측과 실제 타겟 간의 손실을 계산합니다.
  • loss.backward(): 손실에 대한 그래디언트를 계산하기 위해 역전파를 수행합니다.
  • optimizer.step(): 계산된 그래디언트를 사용하여 모델의 가중치를 업데이트합니다.

추가로 에포크(epoch)의 의미는 머신 러닝, 특히 신경망 학습에서 전체 학습 데이터셋이 모델을 통과하는 한 번의 완전한 사이클을 의미합니다. 각 에포크에서 모델은 데이터셋의 모든 샘플을 한 번씩 처리하고, 이를 통해 가중치를 업데이트합니다. 모델의 성능을 향상시키기 위해 여러 에포크를 거치며 학습을 반복합니다.

이 예제는 PyTorch를 사용하여 간단한 신경망을 구성하고, 작은 데이터셋에 대해 신경망을 학습시키는 기본적인 프로세스를 보여줍니다. 실제로 복잡한 데이터셋과 문제에 적용할 때는 더 많은 레이어, 다양한 데이터 전처리 방법, 복잡한 최적화 알고리즘 등이 사용될 수 있습니다.

2023년 10월 15일 일요일

Chat GPT4 + DALL.E 3

몇일전에 CHAT-GPT4 에 DALL-E3 가 integration되었다 (유로 사용자대상인듯)

이제 그림까지 그려주는 중, 

나무 괴물을 그려달라고 했더니, 아래와 같이 그려줌, 

별도의 프롬프트도 같이 제공한다. 간단한 말을 GPT가 디테일하게 설명을 만들고 DALL.E가 그림을 그리는 형태인듯하다. 


앞으로 어떻게 될지 더 기대가 되는 상황으로 보인다. 

저작권등은 어떻게 될지도 궁금하다. 이제는 어떤게 진짜인지 어떤게 가짜인지 분간을 하지 못하는 세상이 될것이고 어떤게 원본인지 구분하기도 쉽지 않을 듯 하다. 

2023년 10월 10일 화요일

Python whisper open AI

Whisper는 OpenAI에서 공개한 STT(Speech to Text) 이다


이게 용도가 여러가지 있겠지만, 영어 공부나 자막만들기, 스크립트 만들기, 회의록을 작성한다던가 할때 유용하다. 

특히 언어를 배울때 특히, 영어 공부하는 용도로 굉장히 유용할 듯하다. 
요즘 게다가 AI 번역기들이 성능이 어마 무시하기때문에 여기에 연동을 시키면, 

언어적 장벽없이 이것저것을 할 수 있을 정도가 될듯하다. 


보통 영어 뉴스 듣기 이런거를 하다가 막히는 게 뭐냐하면, 제대로 된 스크립트를 얻을 수가 없다는데 있다. 그래서, 이미 스크립트가 있는 경우는 쉽게 하지만, 최신 뉴스들에서는 어려운 점이 있는데, 이 Whisper를 사용하면 최신 뉴스에 대해서도 스크립트를 얻을 수 있기 때문에 굉장히 유용한점이 있다. 


유튜브에서 다운받기

유튜브에서 파이썬으로 파일 내려 받는 방법은 다음과 같다. 

먼저 pytube를 설치한다. 


pip install pytube


그 다음에 아래와 같이 아래와 같이 수행할 경우, mp4 audio 형태로 다운을 받을 수가 있다. 

import pytube

video = "https://www.youtube.com/watch?v=[유튜브 주소]"
data = pytube.YouTube(video)
# Converting and downloading as 'MP4' file
audio = data.streams.get_audio_only()
audio.download()

다음은 whisper를 설치한다.

pip install -U openai-whisper


이상태에서 whisper로 내려받은 mp4 파일을 text로 변환하면 된다. 영어는 거의 상당히 정확하게 text를 뽑아주니, 이를 잘 활용하면 유용할듯하다.다음은 whisper로 변환를하는 예제이다.  


import whisper

model = whisper.load_model("base")
fname = "파일이름"
text = model.transcribe(f"{fname}.mp4")

with open(f'{fname}.txt','w') as wf:
  print (text['text'],file=wf)



다만 whisper runtime은 바로 나오지는 않고 시간이 많이 소모되기는 하다. 






2023년 9월 23일 토요일

python pybind 11 c++ 과 연결하기

pybind 라는 패키지가 있다.

c++과 연결하는 것인데, header only library이고,

아래 페이지가 해당 사이트이다. 
https://github.com/pybind/pybind11

기존에는 ctype등을 이용해서 주로 python과 C를 연결했었는데, 
이것은 C++과 다이렉트로 연결해주는 패키지이다. 
이전에도 C++은 python과 바로 연결은 안되고, extern이라든지 c형태로 함수를 다시 재구성해서 노출시키는 방법들을 사용했었는데, 이것은 간단한 작성으로 이런것들을 가능하게 해주는듯하다. 

이전에 Boost.Python이 그런역할을 해주는데, 부스트라는게 사실 좀 헤비한 면이 없지 않은지라 header only에 standard c++만 사용한 이 패키지도 나쁘지는 않은듯하다. 


먼저 pybind설치

>> pip install pybind11 

아래와 같이 c-code를 작성한다. example.cpp

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

namespace py = pybind11;

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // 모듈 독스트링 설정

    m.def("add", &add, "A function which adds two numbers"); // 함수 바인딩
}

이것을 다음과 같이 컴파일 header-only이기때문에 python3 -m pybind11 --includes 이 명령어를 통해서 관련 헤더가 추가된다.


c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`

아래와 같이 python 에서 불러들이면 끝

import example

result = example.add(1, 2)
print(result)  
# 출력: 3

위와 같이 간단하게 python에서 c-code를 실행시키는 코드를 만들수 있다.


2023년 9월 8일 금요일

NumPy Array 생성 함수

 NumPy에서는 다양한 방법으로 배열을 생성할 수 있는 함수들을 제공합니다. 이러한 함수들에 대해서 정리해보았슨비다.

NumPy Array 생성 함수

함수설명예제결과
np.array주어진 데이터로부터 배열을 생성np.array([1, 2, 3])[1, 2, 3]
np.zeros모든 원소가 0인 배열 생성np.zeros((2, 3))[[0., 0., 0.], [0., 0., 0.]]
np.ones모든 원소가 1인 배열 생성np.ones((3, 2))[[1., 1.], [1., 1.], [1., 1.]]
np.empty초기화되지 않은 배열 생성np.empty((2, 2))랜덤 값
np.arange주어진 범위와 간격의 배열 생성np.arange(0, 10, 2)[0, 2, 4, 6, 8]
np.linspace선형 간격의 배열 생성np.linspace(0, 1, 5)[0., 0.25, 0.5, 0.75, 1.]
np.logspace로그 간격의 배열 생성np.logspace(0, 3, 4)[1., 10., 100., 1000.]
np.eye단위 행렬 생성np.eye(3)[[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]
np.random.rand랜덤한 원소를 가진 배열 생성np.random.rand(2, 2)랜덤 값 (0~1 사이)

예제 코드

import numpy as np

# np.array 예제
a = np.array([1, 2, 3])
print("np.array:", a)

# np.zeros 예제
b = np.zeros((2, 3))
print("np.zeros:", b)

# np.ones 예제
c = np.ones((3, 2))
print("np.ones:", c)

# np.empty 예제
d = np.empty((2, 2))
print("np.empty:", d)

# np.arange 예제
e = np.arange(0, 10, 2)
print("np.arange:", e)

# np.linspace 예제
f = np.linspace(0, 1, 5)
print("np.linspace:", f)

# np.logspace 예제
g = np.logspace(0, 3, 4)
print("np.logspace:", g)

# np.eye 예제
h = np.eye(3)
print("np.eye:", h)

# np.random.rand 예제
i = np.random.rand(2, 2)
print("np.random.rand:", i)

이러한 NumPy 함수들을 사용하여 다양한 형태와 속성을 가진 배열을 쉽게 생성할 수 있습니다. 각 함수가 어떤 상황에 유용한지를 이해하면, 이부분 사용하는데 문제없을 듯 합니다.

2023년 9월 6일 수요일

NumPy Broadcasting


Broadcasting은 NumPy 라이브러리에서 다른 형태(shape)의 배열 간에도 산술 연산이 가능하게 해주는 기능입니다. 일반적으로, NumPy에서 배열 간 연산은 배열의 형태가 동일해야 하는데, Broadcasting은 이러한 제약을 완화해줍니다.

기본 규칙

Broadcasting은 다음과 같은 규칙을 따릅니다:

  1. 두 배열의 차원 수가 다르면, 더 작은 차원을 가진 배열의 형태(shape) 앞에 1을 추가합니다.
  2. 두 배열이 어떤 차원에서도 크기가 동일하거나, 한쪽이 1이라면 호환되는 것으로 간주됩니다.
  3. 어느 한 차원에서도 크기가 일치하지 않고 1도 아니라면 오류가 발생합니다.

이것 말은 어려운데 실제 동작하는것보면 쉽게 이해할 수 있습니다.

예제

예제 1: 벡터와 스칼라 덧셈

import numpy as np

a = np.array([1, 2, 3])
b = 2

result = a + b
# result: array([3, 4, 5])

예제 2: 2차원 배열과 1차원 배열 덧셈

A = np.array([[1, 2], [3, 4], [5, 6]])
B = np.array([1, 2])

result = A + B
# result: array([[2, 4], [4, 6], [6, 8]])

장점과 단점

장점

  • 간결성: 더 적은 메모리와 코드로 같은 연산을 수행할 수 있습니다.
  • 성능: Broadcasting을 이용한 연산은 내부적으로 최적화되어 있어 빠른 연산 속도를 제공합니다.

단점

  • 복잡성: Broadcasting 규칙을 이해하지 못하면 예상치 못한 결과를 얻을 수 있습니다.
  • 디버깅: 문제가 발생했을 때, 디버깅이 상대적으로 어렵습니다.

결론

NumPy의 Broadcasting 기능은 배열 연산을 더 간편하고 빠르게 해주지만, 사용에 앞서 해당 메커니즘을 잘 이해하는 것이 중요합니다. 잘 활용하면 다양한 수학적 문제와 데이터 분석 작업에서 큰 이점을 볼 수 있습니다.

2023년 7월 23일 일요일

리눅스에서 pdf 파일 합치는 방법

우분투에서 다음 방법으로
pdftk 를 설치한다

sudo apt-get install pdftk

Linux에서 PDF 파일을 합치려면, pdftk라는 명령어 도구를 활용하면 된다. pdftk는 PDF 문서를 합치는 작업부터 페이지 회전, 삭제, 메타데이터 수정 등 다양한 기능을 제공한다.

만약 pdftk가 설치되어 있지 않다면, 아래의 명령어로 설치하면 된다.

Ubuntu 혹은 Debian 기반의 시스템인 경우:


> sudo apt-get install pdftk



설치가 완료되면, pdftk 명령어를 활용해 PDF 파일을 합칠 수 있다. 예를 들어, file1.pdf와 file2.pdf 두 파일을 output.pdf라는 하나의 파일로 합치려면 아래와 같이 실행하면 된다.


> pdftk file1.pdf file2.pdf cat output output.pdf

여기서 cat 옵션은 입력된 파일들을 순서대로 연결해 하나의 출력 파일을 생성한다는 것을 의미한다. output 키워드 다음에는 생성될 파일의 이름을 지정하면 된다.

또한 pdftk는 페이지 순서 변경이나 특정 페이지만 추출하는 등의 다양한 고급 기능도 제공한다. 자세한 내용은 man pdftk 명령어를 통해 pdftk의 매뉴얼 페이지를 확인하면 된다.

2022년 12월 11일 일요일

파이썬 math (nextafter, ulp, gcd, lcm) (3.9이상)

 

math update

파이썬 3.9 math함수들이 업데이트 되었습니다 이번에는 이 변경점들에 대해서 알아보도록 하겠습니다.

nextafter, ulp

파이썬 3.9에 추가된 이 함수는 부동소수점에서 나타낼 수 있는 가장 작은 다음 값을 찾아줍니다. (Java에도 동일한 이름의 함수가 존재합니다.)

진정한 실수(floating point)에서는 두 수사이에 무한대 개수의 값이 있지만, 실제 컴퓨터는 이것은 floating point를 표현하는 방법이 IEEE-754 기반으로 표현하기때문에, 유한개의 숫자가 존재하고, 이중 가장 근접한 값을 찾아주는 함수입니다. 파이썬 뿐 아니라 대부분의 언어들이 IEEE-754로 floating point를 처리하기 때문에 비슷한 부분이 있습니다.

마찬가지로 ulp함수도, 유효숫자기반의 가장 작은 숫자, 즉 오차범위을 알려줍니다. y를 향한 x 다음의 부동 소수점 값을 반환합니다. x가 y와 같으면, y를 반환합니다.

다음 예제를 참고 바랍니다 아래와 같이 특정 숫자의 가장 작게 차이는

from math import nextafter, ulp

print (nextafter(2,3)) # 2와 3사이의 next floating point value
# 2.0000000000000004

print (nextafter(6,10))
# 6.000000000000001

print (nextafter(0,9))
#5e-324
print (nextafter(9,0))
#8.999999999999998

ulp함수를 찍어보면,

print (ulp(3))
print (ulp(3.14159265))
# 4.440892098500626e-16
# 4.440892098500626e-16
print (ulp(100_000_000_000_000_000))
print (ulp(10_000_000_000_000_000))
print (ulp(10_000_000_000_000))
print (ulp(10_000_000_000))

# 16.0
# 2.0
# 0.001953125
# 1.9073486328125e-06

ulp함수를 찍어보면, 큰 수일 수록 한틱이 움직일때 같이 움직이는 ulp숫자가 커지는 것을 확인할 수가 있습니다. 반대로 수가 작으면 작을 수록 유효한 한틱이 작아지기때문에 그 range만큼 같이 움직이는 것을 볼 수가 있습니다.

이 함수는 정밀도가 높은 연산을 할 때, 이때의 오차 범위를 계산할 수 있습니다

gcd(최대공약수), lcm(최소공배수)

기존 파이썬 버전의 최대공약수, 최소공배수를 구하는 gcd, lcm 함수는 인자를 2개밖에 받지 못하였는데, 3.9버전 부터는 인자가 여러개 되어도 문제 없이 동작합니다.

from math import lcm, gcd

print (gcd(12,60,84)) # 12
print (gcd(24,18,12)) # 6
print (lcm(3,4,5)) # 60 

위와 같이 math함수 변경점에 대해서 알아 보았습니다.

2022년 12월 4일 일요일

Numpy Array Join (hstack , vstack)

이번에는 Array Join은 Array를 붙이는 방법을 설명합니다. NumPy에서는 스택 개념을 사용하여 이와 관련하여 여러 기능을 제공합니다. vstack과 hstack이 사용됩니다 아럐 예제를 보면 간단합니다. vstack은 위아래로 쌓습니다. hstack의 경우는 좌우로 확장을 해갑니다.

import numpy as np

A = np.ones((3, 3))
B = np.zeros((3, 3))
print (np.vstack((A,B)))
print (np.hstack((A,B)))
'''
# vstack
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]
 [0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

# hstack
[[1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0. 0.]
 [1. 1. 1. 0. 0. 0.]]
'''

여러 배열 사이에서 쌓기를 수행하는 두 가지 다른 함수는 column_stack() 및 row_stack()입니다. 이러한 기능은 이전의 두 기능과 다르게 작동합니다. 1차원 배열을 column으로 쌓을지 row방향으로 쌓을지를 정합니다.

import numpy as np

a = np.array([0, 1, 2])
b = np.array([3, 4, 5])
c = np.array([6, 7, 8])
print( np.column_stack((a, b, c)) )
print( np.row_stack((a, b, c)) )
'''
# column_stack
[[0 3 6]
 [1 4 7]
 [2 5 8]]

#row_stack
[[0 1 2]
 [3 4 5]
 [6 7 8]]
'''

이상으로 Numpy array join에 대해서 알아보았습니다. 


2022년 11월 28일 월요일

파이썬 딕셔너리 merge (|) 연산자 추가 (3.9이상)

유니온 연산자(|) 


딕셔너리에 | (유니온 연산자)를 사용할 수 있습니다. 값을 병합합니다. 기존의 값이 있으면 새 값으로 업데이트 합니다 x.update(y) 의 간단한 버전입니다.
x = {"k1": "v1x", "k2": "v2x"}
y = {"k2": "v2y", "k3": "v3y"}
print (x | y)
# {'k1': 'v1x', 'k2': 'v2y', 'k3': 'v3y'}
print (y | x)
# {'k1': 'v1x', 'k2': 'v2x', 'k3': 'v3y'}
여기서 주의 깊게 볼 건 k2값이 순서에 따라 다른 부분 입니다. 뒤에 있는 값이 Update되는 값이라 최신이 됩니다.

이 기능은 파이썬 3.9에서부터 지원합니다. 

2022년 11월 23일 수요일

Python venv(virtual Environment) 오프라인 설치


Venv

virtual 환경은 보통 파이썬 패키지등을 설치하다 보면, 가끔가다가 환경이 꼬이는 경우들이 가끔가다 발생합니다.

특히 pip같은 걸로 관리하는 경우는 그래도 좀 수월하지만, 이것 저것 패키지 dependency가 꼬이는 경우들이 종종 있습니다. 이런 것들을 방지 하기 위해서, venv를 사용합니다,

이전 python2에는 virtualenv라든지 third-party 지원을 사용했다면, 현재는 python 3.3 부터 venv가 기본 패키지 안으로 들어옴에 따라 그냥 venv를 사용하면 됩니다.

venv 실행

실행법은 아래와 같이 실행하면 됩니다.

>> python -m venv [virtualenv_name]

으로 실행하면 됩니다.

여기서는 env1 로 만들어 보겠습니다. 리눅스 기준으로는 아래와 같이 실행합니다.

>> python -m venv env1
>> cd env 
>> source ./bin/activate
(env1) >> 

위와 같이 가상환경이 준비된 것을 확인할 수 있습니다. 빠져나올때는 deactive 를 실행시키면 빠져나올 수 있습니다.

패키지 확인

다음과 같이 pip list 또는 pip freeze 를 치면 현재 깔린 패키지들을 확인할 수 있습니다 pip list의 경우는 pip나 setuptools같은 기본적으로 깔려 있는 패키지까지 출력을 해주고,

>> pip list  
Package    Version
---------- -------
pip        22.0.2
setuptools 59.6.0

패키지 설치

다음 명령어로는 깔려있는 패키지들을 requirement.txt 파일에 저장을 합니다.

(env1)>> pip freeze > requirement.txt

-r 또는 --requirement 옵션을 사용하면, requirement.txt 파일에 있는 패키지들을 설치할 수 있습니다.

(env1)>> pip install -r requirement.txt 

또 예제로, 아래와 같이 django 패키지를 설치할 수 있습니다.

(env1)>> pip install django 
(env1)>> pip freeze
asgiref==3.5.2
Django==4.1.3
sqlparse==0.4.3

패키지 삭제

pip uninstall 명령어를 이용하면 관련 패키지를 삭제할 수 있습니다. 즉, 다음과 같이 하면 관련 패키지들을 삭제할 수 있습니다.

(env1)>> pip freeze > requirement.txt
(env1)>> pip uninstall -r requirement.txt

offline 설치

그리고 사내망 같은 부분은 분리되어 있는 경우들이 있기때문에 offline 설치 방법이 필요합니다.

패키지 다운로드

먼저 외부망에서 pip download 명령어를 이용하면 패키지를 다운로드 받을 수 있습니다. 아래와 같이 django 패키지를 다운로드 받아 봅니다 whl 파일들이 다운된 것을 확인할 수 있습니다.

(env1)>> pip download django 
(env1)>> ls
Django-4.1.3-py3-none-any.whl
asgiref-3.5.2-py3-none-any.whl
sqlparse-0.4.3-py3-none-any.whl

패키지 로컬 설치

이 whl 파일들을 이용해서 다음 명령어를 사용하면 패키지들이 설치가 됩니다 -f 옵션은 whl 파일이 있는 위치를 나타냅니다.

(env1)>> pip install --no-index -f . django

마무리하며

이글을 처음 작성할 때는 python2 시절이었습니다. 그 당시에는 virtualenv, venv 와 같이 비슷한 이름의 패키지가 있어서, 헷갈리는 부분도 많았는데, 현재는 대부분 python3으로 대세가 넘어왔기 때문에 venv기준으로 내용을 정리 해 보았습니다.