6.

Python の外部ライブラリ|pip での導入・requirements.txt・バージョン固定

編集
この記事の要点
  • 外部ライブラリは PyPI で配布され、pip install パッケージ名 で入る
  • インストール名と import 名は一致しないことがあるpip install scikit-learnimport sklearn
  • 入れる前に必ず仮想環境を作る。システムの Python を汚すと戻すのが大変になる
  • 使ったライブラリは requirements.txtバージョン付きで固定する
  • 選ぶ基準は「更新されているか」「対応する Python のバージョン」「ライセンス」

標準ライブラリとの違い

標準ライブラリ外部ライブラリ
入手Python 本体に同梱pip install が必要
os json datetime math rerequests numpy pandas Django
バージョンPython のバージョンに従う個別に上がる。固定が必要
配布時何もしなくてよい相手にも入れてもらう必要がある

標準ライブラリでできることは標準ライブラリで済ませるのが原則です。依存が増えるほど、環境構築の手間と壊れる箇所が増えます。標準側の一覧は 標準ライブラリ を参照してください。

導入の手順

# 1. プロジェクト用の仮想環境を作る
python -m venv .venv

# 2. 有効化(Windows)
.venv\Scripts\activate
# 有効化(Mac / Linux)
source .venv/bin/activate

# 3. インストール
pip install requests

# 4. 確認
pip show requests
python -c "import requests; print(requests.__version__)"

仮想環境を有効にすると、プロンプトの先頭に (.venv) が付きます。これが付いていない状態で pip install するとシステム全体に入ります。作り方の詳細は 仮想環境の構築 を参照してください。

インストール名と import 名は別物

pip installimport
pip install scikit-learnimport sklearn
pip install beautifulsoup4from bs4 import BeautifulSoup
pip install pillowfrom PIL import Image
pip install opencv-pythonimport cv2
pip install pyyamlimport yaml
pip install python-dateutilimport dateutil
pip install Djangoimport django

ModuleNotFoundError が出たとき、入れたつもりの名前で import していないのがよくある原因です。逆に「入れたのに import できない」場合は、別の Python に入っている可能性を疑います。

# どの python / pip を使っているか確認する
python -c "import sys; print(sys.executable)"
pip -V

# 実行中の python に確実に入れる書き方
python -m pip install requests

バージョンを固定する

pip install "requests==2.32.3"     # このバージョンだけ
pip install "requests>=2.31,<3"     # 2.31 以上 3 未満

# 今入っているものを書き出す
pip freeze > requirements.txt

# 別のマシンで同じ状態を作る
pip install -r requirements.txt

requirements.txt の中身は次のような形です。

requests==2.32.3
numpy==2.1.1
pandas==2.2.3

バージョンを書かないと、後日インストールしたときに別のバージョンが入って動かなくなります。「自分の環境では動くのに」の大半はこれが原因です。

更新・削除・一覧

pip list                       # 入っているもの一覧
pip list --outdated            # 新しいバージョンがあるもの
pip install -U requests        # 更新
pip uninstall requests         # 削除
pip show -f requests           # 依存関係と入っているファイル
pip check                      # 依存関係の矛盾を検出

pip uninstallそのパッケージだけを消し、一緒に入った依存パッケージは残ります。環境を作り直したいときは仮想環境のフォルダごと削除するのが確実です。

ライブラリの選び方

  • 最終更新日 — 数年更新されていないものは、新しい Python で動かない可能性がある
  • 対応バージョン — PyPI のページに Requires: Python >=3.9 のように書いてある
  • ライセンス — 業務利用なら MIT / BSD / Apache-2.0 かを確認する。GPL 系は配布条件に注意
  • 依存の数 — 依存が多いライブラリは衝突の原因になりやすい
  • 名前が正しいか — 有名パッケージに似せた偽物が PyPI に登録されることがある。公式ドキュメントに書かれたコマンドをコピーする

よく使われるライブラリ

用途ライブラリ
数値計算・配列NumPy
グラフ描画Matplotlib
表形式データpandas
HTTP 通信requestshttpリクエスト(curl)をする方法
HTML 解析beautifulsoup4Webスクレイピング
Excel の読み書きopenpyxl
Web アプリDjango / Flask / FastAPI

インストールでつまずいたとき

症状原因と対処
ModuleNotFoundErrorimport 名が違う / 別の Python に入った → python -m pip install
Permission deniedシステム領域に入れようとしている → 仮想環境を作る
error: Microsoft Visual C++ 14.0 is requiredソースからのビルドが要求されている → 対応する wheel があるバージョンを選ぶ
TLS/SSL のエラーpip is configured with locations that require TLS/SSL
依存の衝突仮想環境をプロジェクトごとに分ける

pyproject.toml で管理する

近年は requirements.txt の代わりに pyproject.toml にまとめる方式が主流になっています。開発用の依存とアプリ本体の依存を分けて書けるのが利点です。

[project]
name = "myapp"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "requests>=2.32,<3",
    "pandas>=2.2",
]

[project.optional-dependencies]
dev = ["pytest", "ruff", "mypy"]
pip install -e .              # 本体の依存だけ
pip install -e ".[dev]"       # 開発ツールも含めて
ツール特徴
pipvenv標準搭載。追加インストール不要で、どこでも通じる
poetry依存解決とロックファイル。ライブラリの公開まで一貫して扱える
uv非常に高速。pip 互換のコマンドを持つ
condaPython 以外のバイナリも管理できる。科学計算で強い(Anaconda

どれを使うにしても、1 つのプロジェクトで 1 つの方式に統一するのが重要です。pipconda を混ぜると、どちらが入れたのか分からない壊れ方をします。

ネットにつながらない環境へ持ち込む

# つながる環境で、必要なファイルを丸ごと落とす
pip download -r requirements.txt -d ./wheels

# 落としたフォルダごと持ち込み、そこからインストールする
pip install --no-index --find-links=./wheels -r requirements.txt

OS や Python のバージョンが違うと使えないファイルが混ざります。ダウンロードする側と入れる側で、OS・CPU・Python のバージョンを揃えてください。

依存を最新に保つ

pip list --outdated              # 更新があるものを確認
pip install -U requests          # 個別に更新

pip install pip-audit
pip-audit                        # 既知の脆弱性を持つバージョンを検出

バージョンを固定したまま放置すると、脆弱性のあるバージョンを使い続けることになります。固定は「勝手に変わらないため」であって「更新しないため」ではありません。定期的に確認して、テストを通してから上げてください。

関連

編集
Post Share
子ページ
  1. NumPy
  2. Matplotlib
同階層のページ
  1. 基本的なルール
  2. 変数
  3. 演算子
  4. 標準ライブラリ
  5. 外部ライブラリ
  6. 制御構文
  7. リスト(配列)
  8. タプル
  9. セット
  10. 辞書(dict)
  11. クラスとメソッド
  12. 継承の概念と必要性
  13. 継承の構文
  14. コンストラクタ
  15. cookieの値の設定と取得
  16. 例外処理
  17. 例外を文字列で出力する方法
  18. httpリクエスト(curl)をする方法
  19. Responseオブジェクトの中身の確認
  20. 変数が空かどうか判定する方法
  21. タイムゾーンの設定と現在日時の取得と文字列化
  22. シングルクォーテーションとダブルクォーテーションの違い

最近更新/作成されたページ