🐷

python初心者🔰_わからなかったことまとめ

2025/01/12に公開

Python の仮想環境をわかりやすくまとめてみた

最近データサイエンスや機械学習に興味を持って Python を始めました。
「仮想環境ってどうして作る必要があるの?」という疑問を解消するためのメモです。

以下のスライドなどを参考にしています。


1. そもそも仮想環境ってなに?なんで作るの?

仮想環境 (venv) は、プロジェクトごとに別々の Python 環境を作るための仕組みです。
どうして別々にする必要があるかというと、「プロジェクトごとにライブラリのバージョンが異なる」ケースがよくあるからです。

  • 例: プロジェクト A では Pandas v1.3 を使っている
  • 例: プロジェクト B では Pandas v2.0 を使いたい

もし仮想環境を作らずに pip でパッケージをインストールすると、OS全体(システム全体)の Python 環境(グローバル環境)に追加されてしまいます。すると、プロジェクトによって必要なライブラリのバージョンが衝突してしまうことが多々あります。

そこで、仮想環境 (venv) をプロジェクトごとに作成して、ライブラリのインストール先を分けることで、バージョン競合を避けることができます。


グローバル環境とは?

グローバル環境 = OS にインストールされている共通の Python 実行環境

たとえば、仮想環境を作成せずに pip install パッケージ名 を実行すると、
/usr/lib/python3.x/site-packages/ など システム共通 (グローバル) なディレクトリへインストールされてしまいます。
結果、他のプロジェクトでもそのパッケージが参照され、バージョンが食い違ってエラー…といった事態が起こりやすくなります。


2. venv の基本的な使い方

Python 3.3 以降では、標準ライブラリとして venv が同梱されているため、追加インストール不要で使えます。

仮想環境の作成

# 任意のフォルダで
python -m venv myenv
  • myenv という名前のフォルダが作成され、その中に仮想環境が配置されます。

仮想環境の有効化

  • macOS / Linux:
    . myenv/bin/activate
    
  • Windows:
    .\myenv\Scripts\activate
    

有効化すると、ターミナルの先頭に (myenv) のような表示が加わり、この状態で pip install したパッケージは myenv 内のディレクトリにインストールされます。


3. パッケージとライブラリの違いは何?

よく混同されがちですが、一応ざっくりとした使い分けは以下のとおりです。

  • パッケージ (package)

    • Python において __init__.py を含むディレクトリ
    • 複数の .py ファイル(=モジュール)をまとめた構造
  • ライブラリ (library)

    • ある機能を提供するコード群をまとめた呼称(より広い概念)
    • 小規模だと単一パッケージでも「ライブラリ」と呼ぶことがある
    • 大規模だと複数のサブパッケージを束ねて「ライブラリ」となる

NumPy の例

NumPy は「数値計算ライブラリ」と呼ばれますが、実際には numpy/ ディレクトリ以下に core, fft, linalg, random など多数のサブパッケージを持っています。

numpy/
├── __init__.py
├── core/
│   ├── __init__.py
│   ├── ...
├── fft/
│   ├── __init__.py
│   ├── ...
├── linalg/
│   ├── __init__.py
│   ├── ...
├── random/
│   ├── __init__.py
│   ├── ...
└── ...
  • numpy/ や各サブディレクトリに __init__.py があることで、Python に「ここはパッケージですよ」と教える役割を果たしています。
  • ライブラリという呼称は「数値計算や多次元配列の機能をまとめたもの」という大きな塊を示す、より広い概念です。

4. init.py の役割

  • パッケージと認識させる“目印”
    ディレクトリに __init__.py があると、Python はそこを「パッケージ」として扱います。

  • 初期化コードの配置場所
    パッケージが import されるタイミングで、この __init__.py が実行されます。
    そのため、バージョン情報の定義や、必要な変数を事前に読み込んでおくといった初期化処理を入れることも可能です。


5. requirements.txt と lock ファイル

複数人で開発したり、環境を再現したりするときに重要なのが パッケージのバージョン管理 です。

5-1. requirements.txt

pip freeze > requirements.txt
  • 現在インストールされているパッケージとバージョンを requirements.txt に書き出せます。
  • 別の環境で同じバージョンをインストールしたい場合は
    pip install -r requirements.txt
    
    とすれば OK。

5-2. lock ファイル

requirements.txt は手作業で編集することもできますが、依存パッケージまで含めて厳密にバージョン固定したい場合は、さらに “lock ファイル” を使うことがあります。

# 例: 現在の環境のパッケージを lock ファイルに落とし込む
pip freeze > requirements.lock
  • requirements.lock を使うことで、インストール時点の「すべての依存パッケージ含むバージョン一覧」を固定できます。
  • 他の開発者が同じロックファイルを使えば、まったく同じバージョン構成で環境を再現できます。

6. Pipenv や Poetry、Rye の話

venv + pip だけでもプロジェクトごとに分離された環境管理は可能ですが、以下のような パッケージ管理ツール を使うと、さらに便利になります。

  • Pipenv
  • Poetry
  • Rye

これらは、requirements.txt や lock ファイルの管理を自動化したり、仮想環境の作成・切り替えを単純化してくれます。
初学者のうちは、まず venv に慣れておくと良いですが、チーム開発や長期運用になってくると、Pipenv・Poetry・Rye の導入が検討されます。


7. 余談: pyproject.toml って何?

pyproject.toml は、Python パッケージのビルドや依存関係を記述するための新しい標準ファイルです。
Poetry などでは、このファイルに依存パッケージやスクリプトのエントリポイントなどをまとめて書くことで、プロジェクトのメタデータを一元管理します。
今後の Python エコシステムでは、このファイルを軸にした開発フローが主流になりつつあります。


まとめ

  • 仮想環境 (venv) を使うと、プロジェクトごとに独立した Python 環境を作れて便利。
  • パッケージ vs. ライブラリ
    • パッケージ = __init__.py を含むディレクトリ構造
    • ライブラリ = 機能のまとまりを指す広い呼称
  • requirements.txt と lock ファイル を使えば、依存関係の再現性が上がる。
  • より便利なツール (Pipenv, Poetry, Rye) を使うと環境管理やパッケージ管理がさらに楽になる。
  • pyproject.toml は新しい標準として、依存関係やメタデータを一元管理するためのファイル。

参考リンク

まずは venv による仮想環境を習得し、requirements.txtrequirements.lock の作り方を覚えれば、プロジェクトの環境構築で困ることはだいぶ減るはずです。
慣れてきたら、Poetry や Rye なども試してみると良いでしょう。

Discussion