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

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

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

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

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

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

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

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

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

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

*無料ボーナス:*リンク:[Python Tricks:The Book]の章にアクセスするには、ここをクリックして、Pythonのベストプラクティスを簡単な例とともに示します。すぐに適用して、より美しい+ Pythonコードを記述できます。

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

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

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

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

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

$ which python
/usr/bin/python

ここでは、場所「/usr/bin/python +」によって証明されるように、すべてのユーザーが「 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バージョンを簡単かつ柔軟にインストールおよび管理できる基準をまとめましょう。

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

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

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

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

`+ pyenv +`を使用すると、これらすべてを実行できます。

`+ pyenv +`のインストール

`+ pyenv `自体をインストールする前に、OS固有の依存関係が必要になります。 これらの依存関係はほとんどがCで書かれた開発ユーティリティであり、 ` pyenv +`はソースからビルドしてPythonをインストールするために必要です。 ビルドの依存関係の詳細な内訳と説明については、https://devguide.python.org/setup/#build-dependencies [公式ドキュメント]を参照してください。このチュートリアルでは、最も一般的な方法を紹介しますこれらの依存関係をインストールします。

*注意: *`+ pyenv +`はもともとWindowsをサポートしていませんでした。 ただし、最近アクティブになったhttps://github.com/pyenv-win/pyenv-win[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

これはhttps://wiki.debian.org/Apt[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

このコマンドは、https://brew.sh/[Homebrew]に依存し、macOSユーザーのいくつかの依存関係をインストールします。

ヒント: Mojave以降(10.14以降)を実行する場合は、https://developer.apple.com/documentation/xcode_release_notes/xcode_10_release_notes#3035624 [追加のSDKヘッダー]もインストールする必要があります。

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

このコマンドは、パッケージマネージャーとしてhttps://wiki.alpinelinux.org/wiki/Alpine_Linux_package_management [+ apk +]を使用し、AlpineにPythonのすべてのビルド依存関係をインストールします。

pyenv-installerを使用する

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

$ curl https://pyenv.run | bash

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

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

  2. + pyenv-virtualenv + : `+ pyenv +`および仮想環境用のプラグイン

  3. + pyenv-update + : `+ pyenv +`を更新するためのプラグイン

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

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

*注意:*上記のコマンドはhttps://github.com/pyenv/pyenv-installer/blob/master/bin/pyenv-installer[pyenv-installer script]をダウンロードしてローカルで実行するのと同じです。 そのため、実行しているものを正確に確認したい場合は、自分でファイルを表示できます。 または、本当にスクリプトを実行したくない場合は、https://github.com/pyenv/pyenv#basic-github-checkout [手動インストール手順]をチェックアウトできます。

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

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

問題がありますか? https://github.com/pyenv/pyenv [+ pyenv + documentation]には便利なhttps://github.com/pyenv/pyenv/wiki[FAQ]に加えて、素晴らしいインストールノートがあります。 https://github.com/pyenv/pyenv/wiki/Common-build-problems [ビルドの一般的な問題]

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

$ pyenv install 3.8-dev

*プロのヒント:*しばらく `+ 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の観点から_呼び出される実行可能ファイルです。 実際のパスを表示する場合は、次を実行できます。

$ 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

*プロのヒント:*インストールした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 Description

-l/--list

Lists all available Python versions for installation

-g/--debug

Builds a debug version of Python

-v/--verbose

Verbose mode: print compilation status to 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 `はshimsを使用して機能するため、このコマンドを使用すると、実行中の ` 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 +`に設定します。 詳細については、link:#specifying-your-python-version [Pythonバージョンの指定]のセクションを参照してください。

+ 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 `がPythonバージョンとして ` 3.6.8 +`を使用したいことがわかります。 見つかったファイルの場所も示します。 そのファイルは実際に存在し、その内容をリストできます。

$ 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 [複数の環境での作業]のセクションで、これらのファイルを管理するための意見の多いプロセスについて説明します。

仮想環境と + pyenv +

仮想環境は、Pythonのインストールとアプリケーションを管理する重要な部分です。 仮想環境について聞いたことがない場合は、https://realpython.com/python-virtual-environments-a-primer/[Python Virtual Environments:A Primer]をご覧ください。

仮想環境と + pyenv +`は天国で行われたマッチです。 `+ pyenv +`にはhttps://github.com/pyenv/pyenv-virtualenv [+ pyenv-virtualenv `]という素晴らしいプラグインがあり、複数のPythonバージョン_and_複数の仮想環境での作業を簡単にします。 「 pyenv 」、「 pyenv-virtualenv 」、および「 virtualenv 」や「 venv +」などのツールの違いを知りたい場合は心配しないでください。 あなたは一人じゃない。

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

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

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

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

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

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

仮想環境の作成

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

$ pyenv virtualenv <python_version> <environment_name>

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

`+ <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 <environment_name>
$ 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 *はPython 2.7および3.6をサポートします。
  1. project2 は、Python 3.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バージョン_および_正しい仮想環境を自動的にアクティブ化します。

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

上記の例で説明したように、 `+ 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 `コマンドを見つけようとしますが、アクティブな環境でそれを見つけるため、コマンドの実行を許可します。 これは、https://tox.readthedocs.io/en/latest/[tox]のようなツールを実行するために、 ` PATH +`で複数のバージョンのPythonを使用可能にする必要がある場合に非常に便利です。

プロのヒント: toxと `+ pyenv +`を使用している場合は、https://pypi.org/project/tox-pyenv/[tox-pyenv]パッケージをチェックアウトする必要があります。

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

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

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

$ pyenv local project2 3.6.8

結論

複数の環境をサポートしたいプロジェクトにより簡単に貢献できるようになりました。 また、開発ツールを台無しにする心配をせずに、すべて最新のPythonバージョンをより簡単にテストできます。すべて素晴らしいツールである `+ pyenv +`です。

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

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

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

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

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

まだ質問がある場合は、コメントセクションまたはTwitterでお気軽にお問い合わせください。 さらに、https://github.com/pyenv/pyenv [pyenv documentation]は素晴らしいリソースです。

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

私のように、さまざまな仮想環境とPythonバージョンを絶えず切り替える場合、現在どのバージョンがアクティブであるかについて混乱するのは簡単です。 oh-my-zshとhttps://github.com/agnoster/agnoster-zsh-theme[agnoster theme]を使用します。私のプロンプトは次のようになります:

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

この場合の私のPythonバージョンは `+ project1-venv +`であり、プロンプトの最初にすぐに表示されます。 これにより、使用しているPythonのバージョンをすぐに確認できます。 これも使用したい場合は、https://gist.github.com/loganasherjones/bd9b7614f80b96cf700fd60e9e256f41 [agnoster-pyenv theme]を使用できます。