python初心者🔰_わからなかったことまとめ
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
ファイル(=モジュール)をまとめた構造
- Python において
-
ライブラリ (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
に書き出せます。 - 別の環境で同じバージョンをインストールしたい場合はとすれば OK。
pip install -r requirements.txt
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
は新しい標準として、依存関係やメタデータを一元管理するためのファイル。
参考リンク
- Pythonの仮想環境を完全に理解する(かもしれない) [speakerdeck]
- Python パッケージ管理ツール venv の使い方 [Qiita]
- Pythonパッケージ管理ツールまとめ2023 (Poetry, Pipenv, etc.) [Zenn]
まずは venv
による仮想環境を習得し、requirements.txt
や requirements.lock
の作り方を覚えれば、プロジェクトの環境構築で困ることはだいぶ減るはずです。
慣れてきたら、Poetry や Rye なども試してみると良いでしょう。
Discussion