WSL上でpython環境構築してみた


## 概要

本記事は、WSL（Windows Subsystem for Linux）上で Python 環境を構築し、mamba を用いて仮想環境を作るまでの過程をまとめたものです。

WSL を使ったことがない方からすると、最初は複雑に見えますが、一度理解すればそれほど難しくありません。この記事では、なるべく専門用語を避けて、初心者の方でもわかりやすく説明していきます。

## 目次

1. [はじめに](#1-はじめに)
2. [基礎知識編](#2-基礎知識編)
   - [2.1 ライブラリ、パッケージ、モジュールって何？](#21-ライブラリパッケージモジュールって何)
   - [2.2 環境構築で出てくる専門用語](#22-環境構築で出てくる専門用語)
   - [2.3 ディストリビューション（セット商品）](#23-ディストリビューションセット商品)
   - [2.4 パッケージの入手先（チャンネル）](#24-パッケージの入手先チャンネル)
   - [2.5 依存関係について](#25-依存関係について)
   - [2.6 開発を楽にするツール](#26-開発を楽にするツール)
3. [実践編：セットアップ手順](#3-実践編セットアップ手順)
   - [3.1 Miniforge のインストール](#31-miniforgeのインストール)
   - [3.2 Micromamba のインストール](#32-micromambaのインストール)
   - [3.3 仮想環境の作成](#33-仮想環境の作成)
   - [3.4 動作確認](#34-動作確認)
   - [3.5 環境の共有・再利用](#35-環境の共有再利用)
4. [まとめ](#4-まとめ)

## 1. はじめに

Python 環境構築から逃げ続けて、研究室配属時に痛い目を見た経験があります。

「とりあえず Anaconda をインストールしておけば大丈夫でしょ」という人も多いですが、せっかくなので他の選択肢も知っておくと、いつか役に立つかもしれません。

**💡 この記事で学べること**

- Python 環境構築の基本概念
- mamba を使った効率的な環境管理
- プロジェクトごとに環境を分ける方法

## 2. 基礎知識編

### 2.1 ライブラリ、パッケージ、モジュールって何？

まずは基本的な用語から整理しましょう。土地に例えると分かりやすいです。

#### モジュール = 市町村

- Python ファイル（.py）一つのこと
- 例：`sample.py`を import して、中の関数を使う
- **具体例**：`math.py`（数学関数が入っている）

#### パッケージ = 都道府県

- 複数のモジュールをまとめたフォルダ
- `__init__.py`ファイルが入っているのが特徴
- **具体例**：`requests`パッケージ（HTTP 通信用の複数ファイルをまとめたもの）

#### ライブラリ = 国

- 複数のパッケージで構成される大きな機能のまとまり
- **標準ライブラリ**：Python と一緒にインストールされる（`print()`など）→ 日本
- **外部ライブラリ**：別途インストールが必要（`pandas`、`numpy`など）→ 外国

```
ライブラリ
├── 標準ライブラリ
│   └── print関数、math関数など
└── 外部ライブラリ
    ├── pandasパッケージ（データ分析セット）
    ├── numpyパッケージ（数値計算セット）
    └── matplotlibパッケージ（グラフ作成セット）
```

### 2.2 環境構築で出てくる専門用語

Python 環境構築でよく聞く 4 つの重要な概念を理解しましょう。

#### パッケージ管理ツール

**何をする？** 外部ライブラリのインストール・アンインストール  
**代表例：** pip  
**用途：** `pip install pandas`で pandas をインストール

#### Python バージョン管理ツール

**何をする？** 複数の Python バージョンを切り替え  
**代表例：** pyenv  
**用途** プロジェクトによって Python 3.8 や 3.12 を切り替える

#### 仮想環境管理ツール

**何をする？** プロジェクトごとに独立した環境を作成  
**代表例：** venv  
**用途：** プロジェクト A では古い pandas、プロジェクト B では新しい pandas を使う

> **💡 仮想環境**
>
> アパートの各部屋のようなものです。それぞれの部屋（環境）は独立していて、部屋 A で何をしても部屋 B には影響しません。
>
> - **メリット**：プロジェクト間でライブラリのバージョン衝突を防げる
> - **具体例**：機械学習プロジェクト用環境、Web アプリ用環境を分ける

#### オールインワンツール

**conda** = 上記 3 つをすべて管理

- Python 以外（R 言語など）のパッケージも管理可能
- ただし動作が重い

**mamba** = conda の高速版

- C++で書かれているため依存関係の解決が爆速
- conda と完全互換

**Poetry** = モダンな管理ツール（私は使ったことがありません）

- 最近人気が高まっている（らしい）
- 設定ファイルが分かりやすい（らしい）

### 2.3 ディストリビューション（セット商品）

**ディストリビューション = 必要なツールをまとめたセット商品**

| 名前          | 特徴               | 含まれるもの                      | おすすめ度 |
| ------------- | ------------------ | --------------------------------- | ---------- |
| **Anaconda**  | フルセット（重い） | conda + Python + 数百のライブラリ | ⭐⭐       |
| **Miniconda** | 軽量版             | conda + Python のみ               | ⭐⭐⭐⭐   |
| **Miniforge** | コミュニティ版     | conda + mamba + Python            | ⭐⭐⭐⭐⭐ |

**速度比較**

```
conda（Python製）    → 🐌 遅い（依存解決に時間がかかる）
mamba（C++製）      → 🚗 速い
```

> **使い分け**
>
> - **学習目的**：Anaconda（すべて入っているので楽）
> - **実際の開発**：Miniforge（軽量で高速）

### 2.4 パッケージの入手先（チャンネル）

**チャンネル = パッケージを購入するお店**

```bash
# Anaconda公式ストア（defaults）からインストール
conda install numpy

# コミュニティストア（conda-forge）からインストール
conda install -c conda-forge numpy
```

**どちらを選ぶべき？**

- **defaults**：Anaconda 社が管理、安定している
- **conda-forge**：コミュニティが管理、最新版が早い、選択肢が豊富

> **⚠️ 注意事項**
>
> **Anaconda = 会社名**です。混同しがちですし、誰も気にしてはいないとは思いますが一応：
>
> - 〇「Anaconda ディストリビューションをインストールした」
> - 〇「conda で環境管理している」
> - ×「Anaconda で環境管理している」（会社で管理？）

### 2.5 依存関係について

この辺もまどろっこしいです。私もいまだにどれだっけとなります。覚える必要はないと思います。

| 用語         | 意味                         | 具体例                            |
| ------------ | ---------------------------- | --------------------------------- |
| **依存関係** | A が B を必要とする関係      | pandas は numpy が必要            |
| **依存管理** | 必要なライブラリリストを記録 | requirements.txt に記載           |
| **依存解決** | リストを見て自動インストール | `pip install -r requirements.txt` |
| **間接依存** | 依存先がさらに別のものを依存 | pandas→numpy→BLAS                 |

#### よくある依存の衝突

```
ライブラリA：「numpy 1.20じゃないと動かない！」
ライブラリB：「numpy 1.25以上が必要！」

→ どちらをインストールしても片方が壊れる
```

**解決方法**

1. **自動解決**：mamba/conda に任せる
2. **環境分離**：プロジェクトごとに仮想環境を作る

> **💡 conda/mamba と pip の併用ルール**
>
> 1. **root で pip を使わない**：必ず仮想環境内で
> 2. **conda/mamba を優先**：pip は最後の手段
> 3. **pip 使用後は環境再作成**：依存関係が壊れる可能性
>
> ```
> pip freeze > requirements.txt で簡単に依存関係を抽出して requirements.txt に出力できます。
> ```

- こちらは僕が尊敬している[あまつ楓](https://www.youtube.com/@amazkaede/videos)様の動画で紹介されていた考え方です。

### 2.6 開発を楽にするツール

#### Linter（文法チェッカー）

**役割**：コードの問題を指摘  
**例**：「この変数、定義されてないよ」「使われてない関数があるよ」  
**Python 用**：flake8、pylint

#### Formatter（整形ツール）

**役割**：コードを綺麗に整える  
**例**：インデント統一、余計な空白削除  
**Python 用**：black、autopep8

> **💡 VSCode との連携**
>
> VSCode に Python 拡張機能を入れると、これらのツールが自動で動作します。
> コードを保存するたびに自動整形されて便利です。

## 3. 実践編：セットアップ手順

いよいよ実際に Python 環境を構築していきましょう！

### 3.1 Miniforge のインストール

**Miniforge = conda + mamba + Python のセット**

```bash
# 最新版をダウンロード
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"

# インストール実行
bash Miniforge3-$(uname)-$(uname -m).sh

# 設定を反映（重要！）
source ~/.bashrc
```

> **💡 インストール中の選択肢**
>
> - ライセンス同意：`yes`
> - インストール場所：デフォルトで OK（Enter キー）
> - 初期化：`yes`（重要！これを選ばないとコマンドが使えません）

### 3.2 Micromamba のインストール

**micromamba = 超軽量・高速版**

```bash
# micromambaをダウンロード
curl -L https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba

# 配置場所を作成
mkdir -p ~/micromamba/bin
mv bin/micromamba ~/micromamba/bin/

# コマンドを使えるようにする
echo 'export PATH="$HOME/micromamba/bin:$PATH"' >> ~/.bashrc

# シェル統合（activate/deactivateコマンドが使えるようになる）
echo 'eval "$(micromamba shell hook -s bash)"' >> ~/.bashrc

# 設定を反映
source ~/.bashrc
```

### 3.3 仮想環境の作成

#### mamba を使う場合

```bash
# Python 3.11の環境「myenv」を作成
mamba create -n myenv python=3.11 -c conda-forge

# 環境をアクティベート（使用開始）
mamba activate myenv

# 環境から出る
mamba deactivate
```

#### micromamba を使う場合

```bash
# 同じくPython 3.11環境を作成
micromamba create -n myenv python=3.11 -c conda-forge

# アクティベート
micromamba activate myenv
```

> **💡 環境名の付け方のコツ**
>
> - プロジェクト名：`data-analysis`、`web-scraping`
> - 用途別：`ml-project`、`django-app`
> - Python 版別：`py311`、`py38`

### 3.4 動作確認

```bash
# 現在使用中のPythonの場所を確認
which python
# 出力例：/home/username/miniforge3/envs/myenv/bin/python

# Pythonのバージョンを確認
python --version
# 出力例：Python 3.11.x

# インストール済みパッケージ一覧
mamba list
# または
micromamba list
```

**よくあるトラブルと解決法**

| 問題                           | 原因                             | 解決法                                       |
| ------------------------------ | -------------------------------- | -------------------------------------------- |
| `mamba: command not found`     | パスが通っていない               | `source ~/.bashrc`実行                       |
| システムの Python が表示される | 環境がアクティベートできていない | `mamba activate myenv`実行                   |
| 古いバージョンが表示される     | 別の環境がアクティブ             | `mamba deactivate`してから再度アクティベート |

### 3.5 環境の共有・再利用

#### 現在の環境を記録

```bash
# 仮想環境に入る
mamba activate myenv

# 環境設定をファイルに出力
mamba env export > environment.yml
```

**environment.yml の中身例**

```yaml
name: myenv
channels:
  - conda-forge
dependencies:
  - python=3.11
  - numpy=1.24.3
  - pandas=2.0.2
  - matplotlib=3.7.1
```

#### 環境を再現する

```bash
# 新しいマシンで同じ環境を作成
mamba env create -f environment.yml

# 既存環境を更新
mamba env update -n myenv -f environment.yml
```

#### 環境管理のコマンド

```bash
# 環境一覧を表示
mamba env list

# 環境を削除
mamba env remove -n 環境名

# 特定のパッケージをインストール
mamba install -n myenv numpy pandas

# パッケージを検索
mamba search numpy
```

## 4. まとめ

環境構築は最初こそ複雑に感じますが、一度理解してしまえば開発効率が大幅に向上します。特に複数のプロジェクトを並行して進める場合、仮想環境の使い分けは必須スキルです。ぜひ実際に手を動かして、自分に合った環境構築方法を見つけてください！

### 参考リンク

- [あまつ楓](https://www.youtube.com/@amazkaede/videos)
- [Miniforge 公式](https://github.com/conda-forge/miniforge)
- [micromamba 公式](https://mamba.readthedocs.io/en/latest/user_guide/micromamba.html)
- [conda-forge](https://conda-forge.org/)