pyenvを使用して複数のPythonバージョンを管理する

pyenvを使用して複数のPythonバージョンを管理する

Pythonの複数のバージョンをサポートするプロジェクトに貢献したいと思ったことがありますが、すべてのバージョンを簡単にtestする方法がわかりませんか? Pythonの最新かつ最高のバージョンに興味がありますか? これらの新機能を試してみたいと思うかもしれませんが、開発環境を台無しにする心配はしたくないでしょう。 幸い、pyenvを使用すれば、Pythonの複数のバージョンの管理を混乱させる必要はありません。

この記事では、プロジェクトに費やす時間を最大化し、適切なバージョンのPythonを使用しようとする頭痛に費やす時間を最小限に抑える方法の概要を説明します。

この記事では、次の方法を学習します。

  1. Pythonの複数のバージョンをインストールする

  2. Pythonの最新開発バージョンをインストールします

  3. インストールされているバージョンを切り替える

  4. pyenvで仮想環境を使用する

  5. さまざまなPythonバージョンと仮想環境を自動的にアクティブ化する

Free Bonus:Click here to get access to a chapter from Python Tricks: The Bookは、Pythonのベストプラクティスと、より美しい+ Pythonicコードをすぐに適用できる簡単な例を示しています。

なぜpyenvを使用するのですか?

pyenvは、複数のPythonバージョンを管理するための素晴らしいツールです。 システムに既にPythonがインストールされている場合でも、pyenvをインストールしておくと、新しい言語機能を簡単に試したり、別のバージョンのPythonを使用しているプロジェクトに貢献したりできます。

システムPythonを使用しない理由

「システムPython」は、オペレーティングシステムにインストールされているPythonです。 MacまたはLinuxを使用している場合、デフォルトでは、ターミナルにpythonと入力すると、優れたPythonREPLが得られます。

それでは、なぜそれを使用しないのですか? それを見る1つの方法は、このPythonが実際にオペレーティングシステムに対してbelongsであるということです。 結局のところ、それはオペレーティングシステムと共にインストールされています。 これは、whichを実行したときにも反映されます。

$ which python
/usr/bin/python

ここで、pythonは、その場所/usr/bin/pythonから明らかなように、すべてのユーザーが利用できます。 おそらく、これはあなたが望むPythonのバージョンでもありません:

$ python -V
Pyhton 2.7.12

システムPythonにパッケージをインストールするには、sudo pip installを実行する必要があります。 これは、Pythonパッケージをグローバルにインストールしているためです。これは、別のユーザーが来て、少し古いバージョンのパッケージをインストールしたい場合に現実的な問題です。

同じパッケージの複数のバージョンに関する問題は、あなたに忍び寄って、あなたがそれを最も期待しないときに噛む傾向があります。 この問題が発生する一般的な方法の1つは、人気のある安定したパッケージが突然システムで誤動作することです。 数時間のトラブルシューティングとグーグル検索の後、間違ったバージョンの依存関係をインストールしたことがあり、それが1日を台無しにしている場合があります。

Pythonのバージョンが/usr/local/bin/python3にインストールされている場合でも、安全ではありません。 上記と同じ権限と柔軟性の問題が発生します。

さらに、OSにインストールされているPythonのバージョンを実際に制御することはできません。 Pythonの最新機能を使用したい場合、たとえばUbuntuを使用している場合は、運が悪いかもしれません。 デフォルトのバージョンは古すぎる可能性があるため、新しいOSがリリースされるまで待つ必要があります。

最後に、一部のオペレーティングシステムは実際にパッケージ化されたPythonを操作に使用します。 yumを例にとると、Pythonを多用して仕事をします。 Pythonの新しいバージョンをインストールし、それをユーザースペースにインストールすることに注意しないと、OSを使用する能力に重大な損害を与える可能性があります。

パッケージマネージャーについて

次に注目すべき論理的な場所は、パッケージマネージャーです。 aptyumbrew、またはportなどのプログラムが典型的な次のオプションです。 結局のところ、これはほとんどのパッケージをシステムにインストールする方法です。 残念ながら、パッケージマネージャーを使用しても同じ問題がいくつか見つかります。

デフォルトでは、パッケージマネージャーはパッケージをユーザー空間ではなくグローバルシステム空間にインストールする傾向があります。 繰り返しますが、これらのシステムレベルパッケージは開発環境を汚染し、ワークスペースを他のユーザーと共有することを困難にします。

繰り返しますが、インストールできるPythonのバージョンを制御することはできません。 確かに、いくつかのリポジトリはより多くの選択肢を提供しますが、デフォルトでは、特定のベンダーが特定の日にどのバージョンのPythonを使用しているのかを見ています。

パッケージマネージャーからPythonをインストールする場合でも、パッケージを作成していて、Python 3.4-3.7でサポートおよびテストしたい場合はどうなるかを検討してください。

python3と入力すると、システムで何が起こりますか? 異なるバージョン間でどのようにすばやく切り替えますか? あなたは確かにそれを行うことができますが、それは退屈であり、エラーを起こしやすいです。 PyPy、Jython、またはMinicondaが必要な場合は、パッケージマネージャーがうまくいかない可能性があることを忘れないでください。

これらの制約を念頭に置いて、Pythonバージョンを簡単かつ柔軟にインストールおよび管理できる基準をまとめましょう。

  1. ユーザースペースにPythonをインストールする

  2. Pythonの複数のバージョンをインストールする

  3. 必要なPythonバージョンを正確に指定してください

  4. インストールされているバージョンを切り替える

pyenvを使用すると、これらすべてのことなどを実行できます。

pyenvのインストール

pyenv自体をインストールする前に、OS固有の依存関係が必要になります。 これらの依存関係は主にCで記述された開発ユーティリティであり、pyenvはソースからビルドしてPythonをインストールするために必要です。 ビルドの依存関係の詳細と説明については、official docs.を確認してください。このチュートリアルでは、これらの依存関係をインストールする最も一般的な方法を説明します。

Note:pyenvは元々Windowsをサポートしていませんでした。 ただし、最近アクティブになったpyenv-winプロジェクトには基本的なサポートがあるようです。 Windowsを使用している場合は、お気軽にチェックしてください。

ビルドの依存関係

pyenvはソースからPythonをビルドします。つまり、実際にpyenvを使用するには、ビルドの依存関係が必要になります。 ビルドの依存関係はプラットフォームによって異なります。 Ubuntu/Debianを使用していて、ビルドの依存関係をインストールする場合は、次を使用できます。

$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

これは、Aptを使用してすべてのビルド依存関係をインストールします。 これを実行すると、Debianシステムに移行する準備が整います。

Fedora/CentOS/RHELを使用する場合は、yumを使用してビルドの依存関係をインストールできます。

$ sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel

このコマンドは、yumを使用してPythonのすべてのビルド依存関係をインストールします。

macOSユーザーは、次のコマンドを使用できます。

$ brew install openssl readline sqlite3 xz zlib

このコマンドはHomebrewに依存し、macOSユーザーのいくつかの依存関係をインストールします。

Tip: Mojave以降(10.14+)を実行している場合は、additional SDK headersもインストールする必要があります。

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

更新してくれたRodrigo Vieraに感謝します。

代わりにopenSUSEを使用している場合は、次を実行します。

$ zypper in zlib-devel bzip2 libbz2-devel libffi-devel \
libopenssl-devel readline-devel sqlite3 sqlite3-devel xz xz-devel

このコマンドでも、システムのすべてのPythonビルドの依存関係がインストールされます。

最後に、Alpineユーザーの場合、これを使用できます。

$ apk add libffi-dev ncurses-dev openssl-dev readline-dev \
tk-dev xz-dev zlib-dev

このコマンドは、パッケージマネージャーとしてapkを使用し、Pythonのすべてのビルド依存関係をAlpineにインストールします。

pyenv-installerを使用する

ビルドの依存関係をインストールしたら、pyenv自体をインストールする準備が整います。 pyenv-installer projectを使用することをお勧めします:

$ curl https://pyenv.run | bash

これにより、pyenvが、便利ないくつかのプラグインとともにインストールされます。

  1. pyenv:実際のpyenvアプリケーション

  2. pyenv-virtualenvpyenvおよび仮想環境用のプラグイン

  3. pyenv-updatepyenvを更新するためのプラグイン

  4. pyenv-doctorpyenvとビルドの依存関係がインストールされていることを確認するプラグイン

  5. pyenv-which-ext:システムコマンドを自動的に検索するプラグイン

Note:上記のコマンドは、pyenv-installer scriptをダウンロードしてローカルで実行するのと同じです。 そのため、実行しているものを正確に確認したい場合は、自分でファイルを表示できます。 または、本当にスクリプトを実行したくない場合は、manual installation instructions.をチェックアウトできます。

実行の終了時に、次のようなものが表示されるはずです。

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

出力はシェルに基づきます。 ただし、指示に従ってパスにpyenvを追加し、pyenv /pyenv-virtualenvのオートコンプリートを初期化する必要があります。 これを行ったら、シェルをリロードする必要があります。

$ exec "$SHELL" # Or just restart your terminal

それでおしまい。 これで、pyenvと4つの便利なプラグインがインストールされました。

pyenvを使用してPythonをインストールする

pyenvがインストールされたので、次のステップはPythonのインストールです。 Pythonには多くのバージョンがあります。 利用可能なすべてのCPython 3.6〜3.8を表示する場合は、次の操作を実行できます。

$ pyenv install --list | grep " 3\.[678]"
  3.6.0
  3.6-dev
  3.6.1
  3.6.2
  3.6.3
  3.6.4
  3.6.5
  3.6.6
  3.6.7
  3.6.8
  3.7.0
  3.7-dev
  3.7.1
  3.7.2
  3.8-dev

上記は、pyenvが正規表現に一致することを知っているすべてのPythonバージョンを示しています。 この場合、それはすべて利用可能なCPythonバージョン3.6〜3.8です。 同様に、すべてのJythonバージョンを表示する場合は、次の操作を実行できます。

$ pyenv install --list | grep "jython"
  jython-dev
  jython-2.5.0
  jython-2.5-dev
  jython-2.5.1
  jython-2.5.2
  jython-2.5.3
  jython-2.5.4-rc1
  jython-2.7.0
  jython-2.7.1

ここでも、pyenvが提供する必要のあるすべてのJythonバージョンを確認できます。 すべてのバージョンを表示する場合は、次を実行できます。

$ pyenv install --list
...
# There are a lot

目的のバージョンが見つかったら、1つのコマンドでインストールできます。

$ pyenv install -v 3.7.2
/tmp/python-build.20190208022403.30568 ~
Downloading Python-3.7.2.tar.xz...
-> https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
Installing Python-3.7.2...
/tmp/python-build.20190208022403.30568/Python-3.7.2 /tmp/python-build.20190208022403.30568 ~
[...]
Installing collected packages: setuptools, pip
Successfully installed pip-18.1 setuptools-40.6.2
Installed Python-3.7.2 to /home/realpython/.pyenv/versions/3.7.2

Having Problems?pyenv documentationには、優れたインストールノートと、common build problemsとともに役立つFAQがあります。

pyenvがソースからPythonを構築しているため、これにはしばらく時間がかかりますが、完了すると、ローカルマシンでPython3.7.2を使用できるようになります。 すべての出力を表示したくない場合は、-vフラグを削除してください。 CPythonの開発バージョンでもインストールできます。

$ pyenv install 3.8-dev

Pro Tip:pyenvをしばらく使用していて、探しているバージョンが表示されない場合は、pyenv updateを実行してツールを更新し、次のことを確認する必要があります。最新バージョンにアクセスできます。

チュートリアルの残りの部分では、例では3.6.82.7.15がインストールされていることを前提としていますが、実際にインストールしたPythonバージョンをこれらの値に自由に置き換えることができます。 また、例のシステムPythonバージョンは2.7.12であることに注意してください。

設置場所

前述のように、pyenvはソースからPythonを構築することで機能します。 インストールした各バージョンは、pyenvのルートディレクトリに適切に配置されています。

$ ls ~/.pyenv/versions/
2.7.15  3.6.8  3.8-dev

すべてのバージョンはここにあります。 これらのバージョンを削除するのは簡単なので、これは便利です。

$ rm -rf ~/.pyenv/versions/2.7.15

もちろん、pyenvは、特定のPythonバージョンをアンインストールするコマンドも提供します。

$ pyenv uninstall 2.7.15

新しいPythonを使用する

いくつかの異なるPythonバージョンをインストールしたので、それらの使用方法の基本を見てみましょう。 まず、使用可能なPythonのバージョンを確認します。

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

*は、systemPythonバージョンが現在アクティブであることを示します。 また、これはルートpyenvディレクトリ内のファイルによって設定されていることにも気付くでしょう。 これは、デフォルトでは、まだシステムPythonを使用していることを意味します。

$ python -V
Python 2.7.12

whichを使用してこれを確認しようとすると、次のように表示されます。

$ which python
/home/realpython/.pyenv/shims/python

これは意外かもしれませんが、これがpyenvの動作方法です。 pyenvはそれ自体をPATHに挿入し、OSの観点からはisは呼び出される実行可能ファイルを挿入します。 実際のパスを表示する場合は、次を実行できます。

$ pyenv which python
/usr/bin/python

たとえば、バージョン2.7.15を使用する場合は、globalコマンドを使用できます。

$ pyenv global 2.7.15
$ python -V
Python 2.7.15

$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.pyenv/version)
  3.6.8
  3.8-dev

Pro Tip:インストールしたPythonのバージョンが正しく機能していることを確信するための優れた方法は、組み込みのテストスイートを実行することです。

$ pyenv global 3.8-dev
$ python -m test

これにより、インストールを検証する多くの内部Pythonテストが開始されます。 キックバックして、テストが成功するのを見るだけです。

Pythonのシステムバージョンをデフォルトとして使用したい場合は、次を実行できます。

$ pyenv global system
$ python -V
Python 2.7.12

Pythonの異なるバージョンを簡単に切り替えることができるようになりました。 これは始まりにすぎない。 切り替えたいバージョンが多数ある場合、これらのコマンドを一貫して入力するのは面倒です。 このセクションでは基本について説明しますが、より良いワークフローはworking with multiple environments.で説明されています。

pyenvコマンドの調査

pyenvは多くのコマンドを提供します。 これで利用可能なすべてのコマンドの完全なリストを見ることができます:

$ pyenv commands
activate
commands
completions
deactivate
...
virtualenvs
whence
which

これにより、すべてのコマンド名が出力されます。 各コマンドには、より詳細な情報を提供する--helpフラグがあります。 たとえば、shimsコマンドの詳細を確認したい場合は、次のコマンドを実行できます。

$ pyenv shims --help
Usage: pyenv shims [--short]

List existing pyenv shims

ヘルプメッセージには、コマンドの用途と、コマンドと組み合わせて使用​​できるオプションが説明されています。 次のセクションでは、最もよく使用されるコマンドの概要を簡単に紹介します。

install

上記のinstallコマンドはすでに見ました。 このコマンドを使用して、特定のバージョンのPythonをインストールできます。 たとえば、3.6.8をインストールする場合は、次を使用します。

$ pyenv install 3.6.8

出力には、pyenvがPythonをダウンロードしてインストールしていることが示されています。 使用する可能性のある一般的なフラグの一部は次のとおりです。

Flag 説明

-l/--list

インストールに使用できるすべてのPythonバージョンを一覧表示します

-g/--debug

Pythonのデバッグバージョンをビルドします

-v/--verbose

詳細モード:コンパイルステータスをstdoutに出力します

versions

versionsコマンドは、現在インストールされているすべてのPythonバージョンを表示します。

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

この出力は、2.7.153.6.83.8-dev、およびsystem Pythonがインストールされていることを示しているだけでなく、systemPythonがアクティブであることも示しています。 現在のアクティブバージョンのみを考慮する場合は、次のコマンドを使用できます。

$ pyenv version
system (set by /home/realpython/.pyenv/version)

このコマンドはversionsに似ていますが、現在アクティブなPythonバージョンのみを表示します。

which

whichコマンドは、システム実行可能ファイルへのフルパスを決定するのに役立ちます。 pyenvはシムを使用して機能するため、このコマンドを使用すると、実行可能ファイルpyenvへのフルパスが実行されていることを確認できます。 たとえば、pipがインストールされている場所を確認したい場合は、次のように実行できます。

$ pyenv which pip
/home/realpython/.pyenv/versions/3.6.8/bin/pip

出力には、pipの完全なシステムパスが表示されます。 これは、コマンドラインアプリケーションをインストールしたときに役立ちます。

global

globalコマンドは、Pythonのグローバルバージョンを設定します。 これは他のコマンドで上書きできますが、デフォルトで特定のPythonバージョンを使用するのに役立ちます。 デフォルトで3.6.8を使用したい場合は、次のように実行できます。

$ pyenv global 3.6.8

このコマンドは、~/.pyenv/version3.6.8に設定します。 詳細については、specifying your Python versionのセクションを参照してください。

local

localコマンドは、アプリケーション固有のPythonバージョンを設定するためによく使用されます。 これを使用して、バージョンを2.7.15に設定できます。

$ pyenv local 2.7.15

このコマンドは、現在のディレクトリに.python-versionファイルを作成します。 ご使用の環境でpyenvがアクティブになっている場合、このファイルによってこのバージョンが自動的にアクティブ化されます。

shell

shellコマンドは、シェル固有のPythonバージョンを設定するために使用されます。 たとえば、Pythonの3.8-devバージョンをテストする場合は、次のようにします。

$ pyenv shell 3.8-dev

このコマンドは、PYENV_VERSION環境変数を設定して指定されたバージョンをアクティブにします。 このコマンドは、アプリケーションまたはグローバル設定を上書きします。 バージョンを非アクティブ化する場合は、--unsetフラグを使用できます。

Pythonバージョンの指定

pyenvのより紛らわしい部分の1つは、pythonコマンドがどのように正確に解決されるか、およびどのコマンドを使用してそれを変更できるかです。 コマンドに記載されているように、使用しているpythonのバージョンを変更する方法は3つあります。 それでは、これらのコマンドはすべてどのように相互作用するのでしょうか? 解決順序は次のようになります。

Pyenv pyramid for order of resolution

このピラミッドは、上から下に読むことを意図しています。 pyenvが見つけることができるこれらのオプションの最初のものは、それが使用するオプションです。 簡単な例を見てみましょう:

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

ここでは、*で示されるようにsystemPythonが使用されています。 次にグローバルな設定を実行するには、globalを使用します。

$ pyenv global 3.6.8
$ pyenv versions
  system
  2.7.15
* 3.6.8 (set by /home/realpython/.pyenv/version)
  3.8-dev

これで、pyenv3.6.8をPythonバージョンとして使用したいと考えていることがわかります。 見つかったファイルの場所も示します。 そのファイルは実際に存在し、その内容をリストできます。

$ cat ~/.pyenv/version
3.6.8

それでは、localを使用して.python-versionファイルを作成しましょう。

$ pyenv local 2.7.15
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev
$ ls -a
.  ..  .python-version
$ cat .python-version
2.7.15

ここでも、pyenvは、pythonコマンドをどのように解決するかを示しています。 今回は~/.python-versionから来ています。 .python-versionの検索は再帰的であることに注意してください。

$ mkdir subdirectory
$ cd subdirectory
$ ls -la # Notice no .python-version file
. ..
$ pyenv versions
  system
* 2.7.15 (set by /home/realpython/.python-version)
  3.6.8
  3.8-dev

subdirectory.python-versionがない場合でも、.python-versionは親ディレクトリに存在するため、バージョンは2.7.15に設定されます。

最後に、shellを使用してPythonバージョンを設定できます。

$ pyenv shell 3.8-dev
$ pyenv versions
  system
  2.7.15
  3.6.8
* 3.8-dev (set by PYENV_VERSION environment variable)

これが行ったのは、$PYENV_VERSION環境変数を設定することだけです。

$ echo $PYENV_VERSION
3.8-dev

オプションに圧倒されていると感じている場合は、working with multiple environmentsのセクションで、主にlocalを使用して、これらのファイルを管理するための意見の分かれたプロセスについて説明します。

仮想環境とpyenv

仮想環境は、Pythonのインストールとアプリケーションを管理する重要な部分です。 これまで仮想環境について聞いたことがない場合は、Python Virtual Environments: A Primerを確認できます。

仮想環境とpyenvは、天国で行われた一致です。 pyenvには、pyenv-virtualenvと呼ばれるすばらしいプラグインがあり、複数のPythonバージョンandの複数の仮想環境を簡単に操作できます。 pyenvpyenv-virtualenv、およびvirtualenvvenvなどのツールの違いがわからない場合は、心配しないでください。 あなたは一人じゃない。

知っておくべきことは次のとおりです。

  • pyenvは、Python自体の複数のバージョンを管理します。

  • virtualenv/venvは、特定のPythonバージョンの仮想環境を管理します。

  • pyenv-virtualenvは、Pythonのさまざまなバージョンにわたる仮想環境を管理します。

頑固なvirtualenvまたはvenvユーザーの場合、心配しないでください。pyenvはどちらともうまく機能します。 実際、必要に応じて、これまでと同じワークフローを維持できますが、pyenv-virtualenvを使用すると、異なるPythonバージョンを必要とする複数の環境を切り替えるときに優れたエクスペリエンスが得られると思います。

幸いなことに、pyenv-installerスクリプトを使用してpyenvをインストールしたので、pyenv-virtualenvが既にインストールされており、準備ができています。

仮想環境の作成

仮想環境の作成は単一のコマンドです:

$ pyenv virtualenv  

技術的には、<python_version>はオプションですが、使用しているPythonのバージョンを確認できるように、常に<python_version>を指定することを検討する必要があります。

<environment_name>は、環境を分離しておくための単なる名前です。 環境にプロジェクトと同じ名前を付けることをお勧めします。 たとえば、myprojectで作業していて、Python 3.6.8に対して開発したい場合は、次のように実行します。

$ pyenv virtualenv 3.6.8 myproject

出力には、いくつかの追加のPythonパッケージ、つまりwheelpip、およびsetuptoolsがインストールされていることを示すメッセージが含まれています。 これは厳密に便宜上のものであり、各仮想環境に対してより完全な機能を備えた環境をセットアップするだけです。

バージョンの有効化

仮想環境を作成したら、次はそれを使用してください。 通常、次を実行して環境をアクティブ化する必要があります。

$ pyenv local myproject

以前にpyenv localコマンドを見たことがありますが、今回はPythonのバージョンを指定する代わりに、環境を指定します。 これにより、現在の作業ディレクトリに.python-versionファイルが作成され、環境でeval "$(pyenv virtualenv-init -)"を実行したため、環境が自動的にアクティブ化されます。

これを確認するには、次を実行します。

$ pyenv which python
/home/realpython/.pyenv/versions/myproject/bin/python

myprojectという新しいバージョンが作成され、python実行可能ファイルがそのバージョンを指していることがわかります。 この環境が提供する実行可能ファイルを見ると、同じことがわかります。 たとえば、pip

$ pyenv which pip
/home/realpython/.pyenv/versions/myproject/bin/pip

シェルで実行するようにeval "$(pyenv virtualenv-init -)"を構成しなかった場合は、次の方法でPythonバージョンを手動でアクティブ化/非アクティブ化できます。

$ pyenv activate 
$ pyenv deactivate

上記は、.python-versionファイルが含まれているディレクトリに出入りするときにpyenv-virtualenvが実行していることです。

複数の環境での作業

学んだことをすべてまとめると、複数の環境で効果的に作業できます。 次のバージョンがインストールされていると仮定します。

$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
  2.7.15
  3.6.8
  3.8-dev

ここで、適切な名前が付けられた2つの異なるプロジェクトに取り組みます。

  1. project1はPython2.7および3.6をサポートします。

  2. project2は、Python3.6および3.8-devでの実験をサポートします。

デフォルトでは、システムPythonを使用していることがわかります。これは、pyenv versions出力の*で示されます。 最初に、最初のプロジェクトの仮想環境を作成します。

$ cd project1/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.6.8 project1
...
$ pyenv local project1
$ python -V
/home/realpython/.pyenv/versions/project1/bin/python

最後に、ディレクトリからcdが出ると、デフォルトでシステムPythonに戻ることに注意してください。

$ cd $HOME
$ pyenv which python
/usr/bin/python

上記の手順に従って、project2の仮想環境を作成できます。

$ cd project2/
$ pyenv which python
/usr/bin/python
$ pyenv virtualenv 3.8-dev project2
...
$ pyenv local 3.8-dev
$ pyenv which python
/home/realpython/.pyenv/versions/3.8-dev/bin/python

これらは、プロジェクトのワンタイムステップです。 これで、プロジェクト間でcdを実行すると、環境が自動的にアクティブになります。

$ cd project2/
$ python -V
Python 3.8.0a0
$ cd ../project1
$ python -V
Python 3.6.8

環境をアクティブ化することを覚える必要はもうありません。すべてのプロジェクトを切り替えることができ、pyenvが正しいPythonバージョンandの正しい仮想環境を自動的にアクティブ化します。

複数のバージョンを同時にアクティブ化する

上記の例で説明したように、project2は3.8の実験的な機能を使用します。 あなたのコードがPython 3.6でも動作することを確認したいとします。 python3.6を実行しようとすると、次のようになります。

$ cd project2/
$ python3.6 -V
pyenv: python3.6: command not found

The `python3.6' command exists in these Python versions:
  3.6.8
  3.6.8/envs/project1
  project1

pyenvは、Python 3.6は現在アクティブな環境では使用できませんが、他の環境では使用できることを通知します。 pyenvは、使い慣れたコマンドを使用して、一度に複数の環境をアクティブ化する方法を提供します。

$ pyenv local project2 3.6.8

これは、仮想環境project2を最初のオプションとして使用することをpyenvに示します。 したがって、コマンド、たとえばpythonが両方の環境で解決できる場合、コマンドは3.6.8の前にproject2を選択します。 これを実行するとどうなるか見てみましょう。

$ python3.6 -V
Python 3.6.8

ここで、pyenvpython3.6コマンドを見つけようとしますが、アクティブな環境でそれを見つけるため、コマンドを実行できます。 これは、実行するためにPATHで複数のバージョンのPythonを使用できる必要があるtoxのようなツールに非常に役立ちます。

Pro Tip: toxとpyenvを使用している場合は、tox-pyenvパッケージをチェックアウトする必要があります。

上記の例で、ライブラリとの互換性の問題を発見し、ローカルテストを行いたいとします。 テストでは、すべての依存関係をインストールする必要があります。 次の手順に従って新しい環境を作成する必要があります。

$ pyenv virtualenv 3.6.8 project2-tmp
$ pyenv local project2-tmp

ローカルテストに満足したら、デフォルト環境に簡単に切り替えることができます。

$ pyenv local project2 3.6.8

結論

複数の環境をサポートしたいプロジェクトにより簡単に貢献できるようになりました。 また、pyenvというすばらしいツールを使用して、開発マシンを台無しにすることを心配することなく、最新かつ最高のPythonバージョンをより簡単にテストできます。

pyenvがどのように役立つかを見てきました。

  • Pythonの複数のバージョンをインストールする

  • インストールされているバージョンを切り替える

  • pyenvで仮想環境を使用する

  • さまざまなPythonバージョンと仮想環境を自動的にアクティブ化する

まだ質問がある場合は、コメントセクションまたはTwitterでお気軽にお問い合わせください。 さらに、pyenv documentationは優れたリソースです。

ボーナス:コマンドプロンプトに環境名を表示する

私のように、さまざまな仮想環境とPythonバージョンを絶えず切り替える場合、現在どのバージョンがアクティブであるかについて混乱するのは簡単です。 oh-my-zshagnoster themeを使用します。これにより、デフォルトでプロンプトは次のようになります。

Agnoster theme with no pyenv prompt

一目で、どのPythonバージョンがアクティブかわかりません。 それを理解するには、python -Vまたはpyenv versionを実行する必要があります。 アクティブなPython環境の把握に費やす時間を削減するために、使用しているpyenv仮想環境をプロンプトに追加します。

Environment name being shown in ZSH command prompt

この場合の私のPythonバージョンはproject1-venvであり、プロンプトの最初にすぐに表示されます。 これにより、使用しているPythonのバージョンをすぐに確認できます。 これも使用したい場合は、私のagnoster-pyenv themeを使用できます。