Pipenv
GitHub概要
スター25,080
ウォッチ360
フォーク1,876
作成日:2017年1月20日
言語:Python
ライセンス:MIT License
トピックス
packagingpippipfilepythonvirtualenv
スター履歴
データ取得日時: 2025/7/20 02:54
言語バージョン管理ツール
Pipenv
概要
Pipenvは、Pythonプロジェクトの依存関係管理と仮想環境を統合したツールです。NPM/Yarnライクなワークフローを提供し、PipfileとPipfile.lockによる決定論的な依存関係管理、組み込みセキュリティスキャン、自動仮想環境管理を特徴とします。pip、virtualenv、pipfile、requirements.txtの機能を統一したモダンなPython開発体験を実現します。
詳細
主な特徴
- 統合ワークフロー: 依存関係管理と仮想環境の一元化
- Pipfile/Pipfile.lock: 直感的な設定ファイルと決定論的なロック
- セキュリティスキャン: PyUp.io統合によるビルトイン脆弱性チェック
- 自動仮想環境: プロジェクトディレクトリでの自動環境作成
- カスタムカテゴリ: 開発、テスト、ドキュメント用の依存関係分離
- VCS統合: GitHubなどからの直接パッケージインストール
- 暗号化ハッシュ: サプライチェーン攻撃防止
アーキテクチャ
PipenvはPipfileを設定の中心とし、インストール時にPipfile.lockを生成します。各プロジェクトで仮想環境を自動作成し、依存関係を分離します。safety パッケージとの統合により、脆弱性データベースをチェックします。
他ツールとの比較
- vs pip/virtualenv: より高レベルな抽象化と統合体験
- vs Poetry: よりシンプルで軽量、npmライクなワークフロー
- vs conda: Python特化でより軽量、一般的な開発に最適
メリット・デメリット
メリット
- NPMライクな体験: JavaScriptエコシステムに慣れた開発者に親しみやすい
- セキュリティファースト: ビルトインの脆弱性スキャン機能
- 決定論的ビルド: Pipfile.lockによる再現可能な環境
- シンプルなワークフロー: 直感的なコマンド体系
- ハッシュ検証: パッケージの整合性保証
- 自動環境管理: 仮想環境の透明な作成・管理
- プロダクション対応: --deployフラグによる本番環境デプロイ
デメリット
- パフォーマンス: 大規模プロジェクトでの依存関係解決が遅い場合がある
- 複雑な依存関係: 複雑な依存関係での解決困難
- メモリ使用: 依存関係解決時の高いメモリ消費
- エラーメッセージ: 分かりにくいエラーメッセージの場合がある
- 成熟度: Poetryほど活発でない開発コミュニティ
参考ページ
書き方の例
インストール
# pipでのインストール
pip install pipenv
# macOSではHomebrewも使用可能
brew install pipenv
# pipxでのインストール(推奨)
pipx install pipenv
# インストール確認
pipenv --version
プロジェクトの初期化と仮想環境作成
# 新しいプロジェクトディレクトリ
mkdir myproject && cd myproject
# Pipfileの初期化(対話的)
pipenv --python 3.11
# 仮想環境の作成(Pipfileがない場合)
pipenv install
# 特定のPythonバージョンを指定
pipenv --python 3.11.7
pipenv --python /usr/bin/python3.11
# 既存のrequirements.txtからの移行
pipenv install -r requirements.txt
パッケージの管理
# パッケージのインストール
pipenv install requests
pipenv install django==4.2.0
pipenv install "requests>=2.20"
# 開発依存関係のインストール
pipenv install pytest --dev
pipenv install black --dev
pipenv install mypy --dev
# カスタムカテゴリでのインストール
pipenv install sphinx --categories docs
pipenv install coverage --categories test
# 複数パッケージの同時インストール
pipenv install requests django flask
# VCS(Git)からのインストール
pipenv install git+https://github.com/user/repo.git
pipenv install git+https://github.com/user/[email protected]
pipenv install git+https://github.com/user/repo.git#egg=package&subdirectory=path
仮想環境の操作
# 仮想環境のシェルを開始
pipenv shell
# 仮想環境内でコマンド実行
pipenv run python app.py
pipenv run pytest
pipenv run python -m pip list
# 仮想環境の情報表示
pipenv --venv
pipenv --py
# グラフ形式での依存関係表示
pipenv graph
# 仮想環境の削除
pipenv --rm
依存関係の更新と管理
# すべての依存関係を更新
pipenv update
# 特定のパッケージのみ更新(2025年新機能)
pipenv upgrade requests
pipenv upgrade requests django
# 開発依存関係のみ更新
pipenv update --dev
# ロックファイルの再生成
pipenv lock
# 本番環境での依存関係のみインストール
pipenv install --deploy
# 開発依存関係を除いてインストール
pipenv install --ignore-pipfile
# Pipfile.lockとの同期チェック
pipenv verify
セキュリティスキャン(2025年更新)
# 新しいscanコマンド(推奨)
pipenv scan
# PyUp.io APIキーを使用したスキャン
pipenv scan --key YOUR_PYUP_API_KEY
# 旧checkコマンド(2025年6月以降非対応)
pipenv check
# 詳細なセキュリティレポート
pipenv scan --full-report
# JSONフォーマットでの出力
pipenv scan --json
設定管理
# pipenv設定の表示
pipenv --support
# 環境変数の設定(.envファイル)
echo "DEBUG=True" > .env
echo "SECRET_KEY=your-secret-key" >> .env
echo "DATABASE_URL=sqlite:///db.sqlite3" >> .env
# .envファイルの自動読み込み
pipenv shell # .envファイルが自動で読み込まれる
# プロジェクト内仮想環境の設定
export PIPENV_VENV_IN_PROJECT=1
pipenv install
# プライベートインデックスの設定
pipenv install --index https://private.pypi.org/simple/ private_package
Pipfileの例
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[[source]]
url = "https://private.pypi.org/simple"
verify_ssl = true
name = "private"
[packages]
requests = "*"
django = ">=4.0,<5.0"
psycopg2-binary = "~=2.9.0"
private-package = {version = "*", index = "private"}
git-package = {git = "https://github.com/user/repo.git", ref = "v1.0.0"}
[dev-packages]
pytest = "*"
black = "*"
flake8 = "*"
mypy = "*"
[docs]
sphinx = "*"
sphinx-rtd-theme = "*"
[test]
coverage = "*"
pytest-cov = "*"
[requires]
python_version = "3.11"
[scripts]
start = "python manage.py runserver"
test = "pytest tests/"
format = "black ."
lint = "flake8 ."
CI/CDでの活用
# GitHub Actions例
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.9, 3.10, 3.11, 3.12]
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install pipenv
run: |
python -m pip install --upgrade pip
pip install pipenv
- name: Install dependencies
run: |
pipenv install --dev --deploy
- name: Security scan
run: pipenv scan
- name: Run tests
run: |
pipenv run pytest
pipenv run black --check .
pipenv run flake8 .
- name: Generate requirements.txt for deployment
run: pipenv requirements > requirements.txt
Docker統合
# Dockerfile例
FROM python:3.11-slim
# pipenvのインストール
RUN pip install pipenv
# 作業ディレクトリの設定
WORKDIR /app
# Pipfileとロックファイルのコピー
COPY Pipfile Pipfile.lock ./
# プロダクション依存関係のインストール
RUN pipenv install --deploy --system
# アプリケーションのコピー
COPY . .
# 環境変数の設定
ENV PYTHONPATH=/app
ENV DJANGO_SETTINGS_MODULE=myproject.settings
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
環境別の管理
# 開発環境のセットアップ
pipenv install --dev
# ステージング環境のセットアップ
pipenv install
# 本番環境のセットアップ
pipenv install --deploy --ignore-pipfile
# requirements.txtの生成(デプロイ用)
pipenv requirements > requirements.txt
pipenv requirements --dev > dev-requirements.txt
# 環境固有のPipfile管理
cp Pipfile Pipfile.development
cp Pipfile Pipfile.production
トラブルシューティング
# 依存関係の問題を診断
pipenv graph
pipenv check --system
# キャッシュのクリア
pipenv --clear
# 仮想環境の完全な再作成
pipenv --rm
pipenv install
# デバッグモードでの実行
pipenv --verbose install package_name
# ロックファイルの問題解決
rm Pipfile.lock
pipenv lock
# システムパッケージとの競合解決
pipenv install --skip-lock package_name
pipenv lock
# 環境変数の確認
pipenv --support
パフォーマンス最適化
# より高速な依存関係解決
export PIPENV_RESOLVER="backtracking"
# 並列インストールの有効化
export PIPENV_MAX_DEPTH=1
# インデックスのミラー使用
pipenv install --index https://pypi.douban.com/simple/ package_name
# キャッシュの最適化
export PIPENV_CACHE_DIR=/fast/disk/cache
スクリプト機能の活用
# Pipfileのscriptsセクション
[scripts]
dev = "python manage.py runserver"
test = "pytest tests/ -v"
coverage = "pytest tests/ --cov=myproject"
format = "black . && isort ."
lint = "flake8 . && mypy ."
deploy = "python manage.py migrate && python manage.py collectstatic --noinput"
# スクリプトの実行
pipenv run dev
pipenv run test
pipenv run coverage
pipenv run format
pipenv run lint