venvとは
venv
は、Python に標準搭載されている仮想環境管理ツールです。
プロジェクトごとに独立した Python 環境を作成し、異なるプロジェクト間でパッケージの依存関係を分離することができます。
これにより、開発者PCや、システム全体の Python 環境を汚さずに開発を進めることが可能になります。
venvの利点
- プロジェクトごとの環境分離
複数のプロジェクトを並行して開発する際、それぞれ異なるライブラリ、バージョンを使用できます。 - システム環境を汚さない
pip install
で直接パッケージをインストールすると、システム全体の Python 環境に影響を与えてしまいます。venv を使うことで、その影響を回避できます。 - チーム開発の効率化
仮想環境を requirements.txt で共有することで、開発メンバーが同じ環境を再現しやすくなります。
インストール方法 (Windows & Mac)
Windows の場合
-
コマンドプロンプトまたは PowerShell を開く
python -m venv venv
-
仮想環境を有効化する
venv\Scripts\activate
Mac の場合
-
ターミナルを開く
-
以下のコマンドを実行し、仮想環境を作成する
python3 -m venv venv
-
仮想環境を有効化する
source venv/bin/activate
仮想環境の無効化(共通)
deactivate
requirements.txt
requirements.txt は、プロジェクトに必要な Python パッケージをリスト化し、開発メンバーが同じ環境を簡単に再現できるようにするファイルです。
これを作成することで、Githubなどのソフトウェア開発プラットフォームにvenvフォルダを無暗にアップロードすることを防ぐとともに、開発メンバーが同じPython開発環境を容易に再現出来るようになります。(.gitignoreなどにvenvを追記することを忘れずに!)
requirements.txt の作成
仮想環境内でインストール済みのパッケージを記録するには、以下のコマンドを実行します。
pip freeze > requirements.txt
requirements.txt からの環境再現
別の環境(他のPCなど)で同じ環境を構築するには、以下のコマンドを実行します。
pip install -r requirements.txt
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を作成できます。
pip freeze | Set-Content -Path requirements.txt -Encoding utf8
Mac側で最初にrequirements.txtを作成する
言葉通りなので割愛します。
※Windows環境でインストール時にエラーが発生した場合は、以下コマンドでBOM無し+改行コード変換してからインストールすると解決すると思います。
(Get-Content requirements.txt) -replace "`n", "`r`n" | Set-Content -Encoding utf8NoBOM requirements.txt
Mac側で文字コードを変換してからrequirements.txtをインストールする
一旦一時ファイルとしてUTF-8に変換したものを作り、リネームして、インストールします。
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
selenium==4.9.1
webdriver-manager==4.0.1
Windows のみインストール
pywin32>=223; sys_platform == 'win32'
pypiwin32; sys_platform == 'win32'
Mac のみインストール
some-mac-specific-package; sys_platform == 'darwin'
この方法を使うことで、Windows / Mac 共通の requirements.txt を維持しつつ、それぞれの環境に応じたパッケージのみインストール することができます。
マーカー無しで環境再現しようとすると、エラーが生じます。以下はMacのエラーメッセージ一例です。
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
・CSVインポート時の文字化けを防ぐ方法