pyenvを使用して複数のPythonバージョンを管理する
Pythonの複数のバージョンをサポートするプロジェクトに貢献したいと思ったことがありますが、すべてのバージョンを簡単にtestする方法がわかりませんか? Pythonの最新かつ最高のバージョンに興味がありますか? これらの新機能を試してみたいと思うかもしれませんが、開発環境を台無しにする心配はしたくないでしょう。 幸い、pyenv
を使用すれば、Pythonの複数のバージョンの管理を混乱させる必要はありません。
この記事では、プロジェクトに費やす時間を最大化し、適切なバージョンのPythonを使用しようとする頭痛に費やす時間を最小限に抑える方法の概要を説明します。
この記事では、次の方法を学習します。
-
Pythonの複数のバージョンをインストールする
-
Pythonの最新開発バージョンをインストールします
-
インストールされているバージョンを切り替える
-
pyenv
で仮想環境を使用する -
さまざまな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を使用する能力に重大な損害を与える可能性があります。
パッケージマネージャーについて
次に注目すべき論理的な場所は、パッケージマネージャーです。 apt
、yum
、brew
、またはport
などのプログラムが典型的な次のオプションです。 結局のところ、これはほとんどのパッケージをシステムにインストールする方法です。 残念ながら、パッケージマネージャーを使用しても同じ問題がいくつか見つかります。
デフォルトでは、パッケージマネージャーはパッケージをユーザー空間ではなくグローバルシステム空間にインストールする傾向があります。 繰り返しますが、これらのシステムレベルパッケージは開発環境を汚染し、ワークスペースを他のユーザーと共有することを困難にします。
繰り返しますが、インストールできるPythonのバージョンを制御することはできません。 確かに、いくつかのリポジトリはより多くの選択肢を提供しますが、デフォルトでは、特定のベンダーが特定の日にどのバージョンのPythonを使用しているのかを見ています。
パッケージマネージャーからPythonをインストールする場合でも、パッケージを作成していて、Python 3.4-3.7でサポートおよびテストしたい場合はどうなるかを検討してください。
python3
と入力すると、システムで何が起こりますか? 異なるバージョン間でどのようにすばやく切り替えますか? あなたは確かにそれを行うことができますが、それは退屈であり、エラーを起こしやすいです。 PyPy、Jython、またはMinicondaが必要な場合は、パッケージマネージャーがうまくいかない可能性があることを忘れないでください。
これらの制約を念頭に置いて、Pythonバージョンを簡単かつ柔軟にインストールおよび管理できる基準をまとめましょう。
-
ユーザースペースにPythonをインストールする
-
Pythonの複数のバージョンをインストールする
-
必要なPythonバージョンを正確に指定してください
-
インストールされているバージョンを切り替える
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
が、便利ないくつかのプラグインとともにインストールされます。
-
pyenv
:実際のpyenv
アプリケーション -
pyenv-virtualenv
:pyenv
および仮想環境用のプラグイン -
pyenv-update
:pyenv
を更新するためのプラグイン -
pyenv-doctor
:pyenv
とビルドの依存関係がインストールされていることを確認するプラグイン -
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.8
と2.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
*
は、system
Pythonバージョンが現在アクティブであることを示します。 また、これはルート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 | 説明 |
---|---|
|
インストールに使用できるすべてのPythonバージョンを一覧表示します |
|
Pythonのデバッグバージョンをビルドします |
|
詳細モード:コンパイルステータスをstdoutに出力します |
versions
versions
コマンドは、現在インストールされているすべてのPythonバージョンを表示します。
$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
2.7.15
3.6.8
3.8-dev
この出力は、2.7.15
、3.6.8
、3.8-dev
、およびsystem
Pythonがインストールされていることを示しているだけでなく、system
Pythonがアクティブであることも示しています。 現在のアクティブバージョンのみを考慮する場合は、次のコマンドを使用できます。
$ 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/version
を3.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
が見つけることができるこれらのオプションの最初のものは、それが使用するオプションです。 簡単な例を見てみましょう:
$ pyenv versions
* system (set by /home/realpython/.pyenv/version)
2.7.15
3.6.8
3.8-dev
ここでは、*
で示されるようにsystem
Pythonが使用されています。 次にグローバルな設定を実行するには、global
を使用します。
$ pyenv global 3.6.8
$ pyenv versions
system
2.7.15
* 3.6.8 (set by /home/realpython/.pyenv/version)
3.8-dev
これで、pyenv
が3.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の複数の仮想環境を簡単に操作できます。 pyenv
、pyenv-virtualenv
、およびvirtualenv
やvenv
などのツールの違いがわからない場合は、心配しないでください。 あなたは一人じゃない。
知っておくべきことは次のとおりです。
-
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パッケージ、つまりwheel
、pip
、および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つの異なるプロジェクトに取り組みます。
-
project1はPython2.7および3.6をサポートします。
-
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
ここで、pyenv
はpython3.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-zshとagnoster themeを使用します。これにより、デフォルトでプロンプトは次のようになります。
一目で、どのPythonバージョンがアクティブかわかりません。 それを理解するには、python -V
またはpyenv version
を実行する必要があります。 アクティブなPython環境の把握に費やす時間を削減するために、使用しているpyenv
仮想環境をプロンプトに追加します。
この場合の私のPythonバージョンはproject1-venv
であり、プロンプトの最初にすぐに表示されます。 これにより、使用しているPythonのバージョンをすぐに確認できます。 これも使用したい場合は、私のagnoster-pyenv themeを使用できます。