venvとrequirements.txt まとめ

## venvとは
`venv` は、Python に標準搭載されている仮想環境管理ツールです。

プロジェクトごとに独立した Python 環境を作成し、異なるプロジェクト間でパッケージの依存関係を分離することができます。

これにより、開発者PCや、システム全体の Python 環境を汚さずに開発を進めることが可能になります。

## venvの利点
1. プロジェクトごとの環境分離
複数のプロジェクトを並行して開発する際、それぞれ異なるライブラリ、バージョンを使用できます。
2. システム環境を汚さない
`pip install` で直接パッケージをインストールすると、システム全体の Python 環境に影響を与えてしまいます。venv を使うことで、その影響を回避できます。
3. チーム開発の効率化
仮想環境を requirements.txt で共有することで、開発メンバーが同じ環境を再現しやすくなります。

## インストール方法 (Windows & Mac)
### Windows の場合
1. コマンドプロンプトまたは PowerShell を開く

    ```powershell
    python -m venv venv
    ```
2. 仮想環境を有効化する
    ```powershell
    venv\Scripts\activate
    ```
### Mac の場合
1. ターミナルを開く
2. 以下のコマンドを実行し、仮想環境を作成する
    ```zsh
    python3 -m venv venv
    ```

3. 仮想環境を有効化する
    ```zsh
    source venv/bin/activate
    ```

### 仮想環境の無効化（共通）
```shell
deactivate
```

## requirements.txt
requirements.txt は、プロジェクトに必要な Python パッケージをリスト化し、開発メンバーが同じ環境を簡単に再現できるようにするファイルです。

これを作成することで、Githubなどのソフトウェア開発プラットフォームにvenvフォルダを無暗にアップロードすることを防ぐとともに、開発メンバーが同じPython開発環境を容易に再現出来るようになります。（**.gitignoreなどにvenvを追記することを忘れずに！**）

### requirements.txt の作成
仮想環境内でインストール済みのパッケージを記録するには、以下のコマンドを実行します。
```shell
pip freeze > requirements.txt
```
### requirements.txt からの環境再現
別の環境（他のPCなど）で同じ環境を構築するには、以下のコマンドを実行します。
```shell
pip install -r requirements.txt
```
:::note info
**tips: requirements.txtの文字コードを変換する**

デフォルトのWindows環境でrequirements.txtを作成すると、文字コードがUTF-16(またはUTF-16BOM)で保存されます。

このままMacのターミナルからインストールしようとするとエラーが発生します。

これを回避する手段は3つあります。
- WIndowsでrequirements.txtを作成する際の文字コードを指定する
- Mac側で最初にrequirements.txtを作成する
- Mac側で文字コードを変換してからrequirements.txtをインストールする
#### WIndowsでrequirements.txtを作成する際の文字コードを指定する

Windows環境で作成する場合、BOMの有無・文字コードをオプションとして明示する必要があります。
以下のコードでBOM無し・UTF-8のrequirements.txtを作成できます。
```sh
pip freeze | Set-Content -Path requirements.txt -Encoding utf8
```
#### Mac側で最初にrequirements.txtを作成する

言葉通りなので割愛します。
※Windows環境でインストール時にエラーが発生した場合は、以下コマンドでBOM無し＋改行コード変換してからインストールすると解決すると思います。
```sh
(Get-Content requirements.txt) -replace "`n", "`r`n" | Set-Content -Encoding utf8NoBOM requirements.txt
```
#### Mac側で文字コードを変換してからrequirements.txtをインストールする
一旦一時ファイルとしてUTF-8に変換したものを作り、リネームして、インストールします。
```zsh
cd {requirements.txtのあるディレクトリ}
iconv -f utf-8 -t utf-8 < requirements.txt > requirements.tmp && mv requirements.tmp requirements.txt
pip install -r requirements.txt
```
:::


## 異なるOSでの共通化
プロジェクト環境を Windows / Mac で共通化する場合、requirements.txt に環境マーカーを使用する必要が出てきます。


以下のように記述することで、OSごとに適切なパッケージのみをインストールできます。
### 環境マーカーを活用した requirements.txt
#### 共通ならマーカーなしでOK
```requirements.txt
selenium==4.9.1
webdriver-manager==4.0.1
```
#### Windows のみインストール
```requirements.txt
pywin32>=223; sys_platform == 'win32'
pypiwin32; sys_platform == 'win32'
```
#### Mac のみインストール
```requirements.txt
some-mac-specific-package; sys_platform == 'darwin'
```
この方法を使うことで、Windows / Mac 共通の requirements.txt を維持しつつ、それぞれの環境に応じたパッケージのみインストール することができます。

マーカー無しで環境再現しようとすると、エラーが生じます。以下はMacのエラーメッセージ一例です。

```sh
ERROR: Could not find a version that satisfies the reqirement pywin32==223 (from pypiwin32)(from versions: none)
ERROR: No matching distribution found for pywin32==223
```

## まとめ
個人でPythonを用いた開発を進める際にも癖付けすることで、プロジェクトメンバーとして参加した際も、スムーズに対応できるかなと思います。enjoy.

## 参考記事
・[出力したCSVがExcelで文字化けバグ！検証と対処法との備忘録 - Qiita](https://qiita.com/ask_nugey/items/6caa848980dec48ff6a0)
・[CSVインポート時の文字化けを防ぐ方法](https://yama-excel.com/csv_import_garbled/)