みなさん、こんにちは。
最近はラズベリーパイに Python を入れて納品するお仕事が増えてきました。そこでいつも頭を悩ませるのが、「開発環境と納品環境のズレ」をどうやってなくすか、という点です。
ラズベリーパイの OS バージョンの違いは pyenv
で Python のバージョンを統一して解決しています。これは以前も記事にしましたね。
しかし、開発環境では pyenv
だけだと他のプロジェクトとのパッケージがごちゃ混ぜになり、思わぬトラブルが起こりがちです。
昔のやり方から新しいやり方へ
以前は pyenv + pipenv
という組み合わせで開発を進めていました。でも、色々と試行錯誤するうちに、pyenv + venv
の組み合わせがとても便利だと気づいたんです。今回は、この「pyenv + venv」の組み合わせ方についてご紹介します。
pyenv
と venv
の役割をおさらい
まずは、それぞれの役割を簡単におさらいしましょう。
pyenv
: Python 本体のバージョンを管理するツールです。- 例えば、
pyenv install 3.11.7
とコマンドを打つだけで、特定のバージョンの Python をインストールできます。これにより、「納品するラズベリーパイと同じ Python をローカルでも動かす」ことが可能になります。 - pyenv のインストール方法はラズベリーパイと同様ですが、もしWSL2を使う場合は、以下の記事が参考になります。
- 例えば、
venv
: プロジェクトごとに仮想環境を作成する仕組みです。venv
を使えば、依存するライブラリをプロジェクトごとに完全に分離できるので、環境が衝突する心配がありません。venv
は Python に標準で備わっているので、追加でインストールする必要がないのも嬉しいポイントです。
この2つを組み合わせれば、「Python のバージョンは pyenv
で固定」「パッケージは venv
で分離」という二段構えで、安心して開発に取り組めます。
開発環境の構築フロー
では、具体的な手順を見ていきましょう。
1. pyenv
で Python をインストールする
まず、ラズベリーパイで使うのと同じ Python を PC にインストールします。
# pyenvでPythonをインストール
pyenv install 3.11.7
# このプロジェクトで使うバージョンを指定
cd my-project
pyenv local 3.11.7
これで、python
と打てば、先ほどインストールした 3.11.7
が使えるようになります。
2. venv
で仮想環境を作成する
次に、プロジェクトごとに環境を分けるために仮想環境を作ります。
# プロジェクトのルートディレクトリで仮想環境を作成
python -m venv .venv
作成した仮想環境を有効化しましょう。
# 有効化(Linux/Mac)
source .venv/bin/activate
# 有効化(Windows PowerShell)
.venv\Scripts\Activate.ps1
これで、.venv
ディレクトリの中に、このプロジェクト専用のパッケージ環境ができました。
3. パッケージをインストールする
仮想環境が有効化されている状態で pip
を使って必要なパッケージをインストールします。
pip install requests
pip install numpy
プロジェクトの依存ライブラリを requirements.txt
にまとめておくと、他の環境でも簡単に再現できるのでとても便利です。
pip freeze > requirements.txt
なぜこの組み合わせが必要なのか?
ラズベリーパイ納品時に安心!
pyenv
でバージョンを合わせておけば、「開発環境では動いたのに、納品したら動かない」といった事故を未然に防げます。
開発プロジェクトごとに環境を分離できる
venv
を使うことで、プロジェクト A とプロジェクト B の依存パッケージが干渉することがなくなります。これで、開発環境がごちゃごちゃになる心配もありません。
誰でも同じ環境を再現可能!
pyenv
で Python のバージョンを固定し、venv
でパッケージを分離、さらに requirements.txt
で依存関係を固定する。この3つを組み合わせることで、誰がどこで作業しても同じ開発環境を再現できるようになります。
まとめ
pyenv
– Python 本体のバージョンを揃えるvenv
– プロジェクトごとの依存パッケージを分離する
ラズベリーパイにPythonスクリプトを設定して納品するような案件では、まず pyenv
で Python のバージョンを統一し、さらに開発環境では venv
で仮想環境を作るのが、トラブルを防ぐためのベストなやり方だと実感しています。
しかし、最近は pyenv + venv
の代わりに uv
を使うケースも増えているようです。次回は「uv
を使った場合のワークフロー」についてもまとめてみたいと思います。
本日も最後までお読みいただき、ありがとうございました。
それでは、よい Python ライフを!