python

似ているようで意外と違う。venvとpyenvの使い分け。

Pythonを使っていざ、本格的に何か開発していこう!ってときに悩むのが、venvとpyenv、どっちを使おうか?ってところだと思います。そこで、venvとpyenvをそれぞれ用途によって使い分けているケンヂまるが、それぞれの特徴や使い方のイメージなんかを紹介します。

環境仮想化ツールの必要性

まず先にPython開発における環境仮想化の必要性についてのおさらいですが、「開発環境では問題なく動いていたのに、本番環境ではエラーになる…。」といったことを避けることが、環境仮想化の主な目的です。

Pythonやパッケージの不一致が、開発環境と本番環境の間で発生するのを防ぐことができます。

そしてそのためのツールが、venvpyenvです。

他にもminocndaやDockerなどの手段は色々ありますが、まずは基本であるvenvやpyenvからはじめるのがいいと思います。

ということでvenvとpyenvの2つにしぼって、どっちを使えばいいのか?という観点で、特徴や使い方のイメージを紹介していきます。

venvはこんなツール

Pythonをインストールすると、venvを使うことができるようになります。

つまりPython公式が採用している環境仮想化ツールです。

venvの特性や使いどころ

venvは、pipでインストールするパッケージを仮想化します。

Flaskを使ってwebアプリを作成する時はflaskとその依存パッケージであるclick, itsdangerous, Jinja2, MarkupSafeなどがインストールされた環境で作業します。

あるいはJupiter Notebookを使ってデータ解析をしたい時はjupyter, pandas, matplotlibなどのパッケージがインストールされた環境で作業します。

どちらの作業もできるように、仮想化せずに全てのパッケージをpip install flask jupyter pandas matplotlibといったようにインストールしてもいいのですが、弊害が発生します。

たったの4つ、パッケージを指定してインストールしたはずが、pip listとして環境にインストールされたパッケージを確認してみると、その数の多さに驚かされます。

それに対し、webアプリのためだけに環境を仮想化しflaskだけをインストールした場合、必要なパッケージはもっと明確になります。

またwebアプリによっては、旧世代のflask1で作成されたために、flask2では動作しない、といったことも、あるかもしれません。

そんな時代遅れプログラムを動作させたい場合には、専用の仮想環境をさらに1つ用意して、flask1.1.2バージョンをインストールすればいいわけです。

venvの使い方

venvの使い方イメージを大まかに説明します。

  1. 仮想環境を作成
  2. 仮想環境を有効化
  3. 仮想環境を使う

という流れになります。

仮想環境を作成

仮想環境の作成は、pythonのモジュールとしてvenvを実行することで行います。

python3 -m venv myenv-dir

このコマンドにより、myenv-dirに、仮想環境フォルダが作成されます。さらに別の仮想環境を作りたければ、python -m venv my-another-env-dirといったように、いくつでも仮想環境フォルダを作ることができます。

仮想環境をアクティブにする

仮想環境フォルダが作成されると、その中にbin/activate.sh(Linux)またはScripts/Activate.sp1(Windows)コマンドが作成されます。

これを呼び出すことで、仮想環境がアクティブになります。

linux・Mac OS環境で仮想環境をアクティブにするコマンド
source myenv-dir/bin/activate
Windows環境で仮想環境をアクティブにするコマンド
myenv-dir/Scripts/Activate

仮想環境を使う

仮想環境をアクティブにしたら、pythonコマンドやpipコマンドはその仮想環境のものに切り替わります。色々なパッケージをpipでインストールしても、deactivateコマンドを使ってその仮想環境から抜ければ、仮想環境に対してインストールされたpipパッケージはインストールされていない状態に戻ります。

Pythonバージョンを使い分けるには

python3 -m venv my-envのようにして仮想環境を作成すると、その仮想環境内のPythonバージョンは、その時点で使われているPythonバージョンになります。

では、バージョン3.7.13の仮想環境を作成したい場合はどうすればいいのか?というと、Python3.7.13をインストールしたうえで、python3.7.13 -m venvを呼び出すことで、Pythonバージョン3.7.13の仮想環境を作ることができます。

pyenvはこんなツール

pyenvは複数のPythonをインストールして使い分けることができる仮想化ツールです。pyenv-virtualenvプラグインもセットで使われることが一般的です。

例えばPython3.10.6の仮想環境を作成したい場合、まずpyenv install 3.10.6としてPython3.10.6をインストールします。さらにそこからpyenv virtualenv 3.10.6 my-virtualとして、Pythonバージョン3.10.6でmy-virtualという名前の仮想環境を作成することができます。

もともとWindows環境には対応していませんでしたが、pyenv-winが使えるようになりました。

pyenvの特性や使いどころ

pyenvは、Anaconda(PythonやR言語を含むデータサイエンス用の環境)やpypy(Pythonより高速で動作するPython言語の実装)など、Python以外の実装もインストールすることができます。

例えばAnacondaをインストールしたい場合は、pyenv install anaconda3-2022.05といったコマンドを発行するだけです。

venvは基本的にPythonバージョン固定で使われることが多いですが、pyenvはPythonバージョンも切り替えながら使われることが多いです。

例えば、Jupiter notebookを使ったデータ解析にはAnacondaを使っているけど、WebアプリケーションはCPython(公式のPython)を使いたいという場合も、pyenv install 3.10.6pyenv install anaconda3-2022.05とするだけでPython実装をインストールすることができます。

またpyenvは、仮想環境を有効化する方法が用途に応じていくつか用意されています。

全体的なPythonのバージョン設定、フォルダと仮想環境を結びつける設定、それから現在実行しているシェルを特定の仮想環境に結びつけるコマンド、などの機能があります。

pyenvの使い方

pyenvの使い方のイメージを大まかに説明します。

  1. pyenv installコマンドでPython実装をインストールする
  2. インストールしたPython実装から特定目的の仮想環境を作成する
  3. 仮想環境を有効化する
  4. 仮想環境を使う

という流れになります。

Python実装をインストールする

Python実装のインストールは、pyenv installコマンドで行います。

CPythonのバージョン3.10.6をインストールする場合
pyenv install 3.10.6
Anacondaの2022-05バージョンをインストールする場合
pyenv install anaconda3-2022.05

インストールしたPython実装から特定目的の仮想環境を作成する

インストールしたPython実装はそのまま使うこともできますが、さらに使用するパッケージごとの環境を作成します。

例えばPython環境で動作させたいWebアプリ開発用の仮想環境と、Anacondaを使ったデータサイエンス実施用の仮想環境の、2つを作成するにはこんな感じのコマンドを実行します。

Python3.10.6を基にしたWebアプリ開発用の仮想環境作成
pyenv virtualenv 3.10.6 my-web-env
anaconda3-2022.05を基にしたデータサイエンス用の仮想環境作成
pyenv virtualenv anaconda3-2022.05 my-science-env

仮想環境を有効化する

pyenvには色々な仮想環境有効化方法が用意されているということは先ほど簡単に紹介しましたが、ここでは最も便利な、フォルダ仮想環境を結びつける方法を紹介します。

この方法では、カレントパスが特定のフォルダ内にあるときに、そこに結び付けられている仮想環境が自動的に使われるようにすることができます。

my-web-appフォルダにmy-web-env仮想環境を結びつける
cd my-web-app
pyenv local my-web-env

pyenv localコマンドで環境指定すると、.python-versionというファイルが作成されて、ここに仮想環境の名前が記憶されます。pyenvこれを読んで、使用する仮想環境を判断します。

my-science-jupyterフォルダにmy-science-env仮想環境を結びつける

上記と同様に、データサイエンスをしたいフォルダに仮想環境my-science-envを結びつける場合も同じです。

cd my-science-jupyter
pyenv local my-science-env

仮想環境を使う

仮想環境を有効化したら、あとはPythonベースの環境ではpipを、Anacondaベースの環境ではcondaを使ってパッケージをインストールしたりして仮想環境を使っていくことができます。(Anacondaのcondaを使うのは少し工夫が必要だったりしますけど。。)

そして仮想環境と関連付けられたフォルダの外にカレントディレクトリを移動すると、自動的に仮想環境がオフになります。仮想環境の切り替え忘れの心配がなくなるので、すごく便利な機能です。

ヂまるはvenvとpyenv、どっちを使ってる?

僕はつい最近までvenvをメインで使っていました。ライトユーザーはvenvを使っていて困ることは少ないと思います。シンプルで学習コストが低くて済むし、Python公式が推奨しているので無難といえます。

ただ僕の場合は仕事柄、開発環境だけでなくいろいろな機器やサーバーでPythonプログラムを実行しないといけなくて、それぞれ使用可能なPythonバージョンが違う、という部分の配慮が要求されます。そしてさらに自分の開発マシンではAnacondaを使いたい、といったこともあり、複数のPythonやAnacondaを切り替えて使うことができるpyenvを使うようになりました。

まとめ

  • Python公式が提供しているvenvは学習コストが低くほとんどのライトユーザー向け
  • Pythonバージョンなども含めて仮想化できるpyenvは複数の機器やサーバーを使う人向け

-python

© 2022 ヂまるBlog