Python 3.3の標準ライブラリには、新しいパッケージvenv
が含まれています。それは何をするのか、そして正規表現(py)?(v|virtual|pip)?env
にマッチするように見える他のすべてのパッケージとどう違うのですか?
virtualenv
は、Pythonライブラリ用の孤立したPython環境を作成する非常に人気のあるツールです。このツールに慣れていない場合は、非常に便利なツールであるため、このツールを学ぶことを強くお勧めします。この回答の残りの部分では、このツールと比較する予定です。
ディレクトリ(例:env/
)にファイルの束をインストールしてから、PATH
環境変数にカスタムのbin
ディレクトリ(例:env/bin/
)を付けるように変更します。 python
またはpython3
バイナリの正確なコピーがこのディレクトリに配置されていますが、Pythonは、環境ディレクトリ内で、最初にそのパスに関連するライブラリを探すようにプログラムされています。これはPythonの標準ライブラリの一部ではありませんが、PyPA(Python Packaging Authority)によって正式に祝福されています。有効化したら、pip
を使用して仮想環境にパッケージをインストールできます。
pyenv
はPythonのバージョンを分離するために使用されます。たとえば、Python 2.6、2.7、3.3、3.4、および3.5に対してコードをテストしたい場合があるので、それらを切り替える方法が必要になります。有効化されると、Pythonコマンド(PATH
、python
)と一致する特殊ファイルがある~/.pyenv/shims
が環境変数pip
の前に付けられます。これらはPythonが出荷したコマンドのコピーではありません。これらは、PYENV_VERSION
環境変数、.python-version
ファイル、または~/.pyenv/version
ファイルに基づいて実行するPythonのバージョンをその場で決定する特別なスクリプトです。 pyenv
は、コマンドpyenv install
を使用して、複数のバージョンのPythonをダウンロードおよびインストールするプロセスも容易にします。
pyenv-virtualenv
は、pyenv
と同じ作者によるpyenv
のプラグインで、便利にpyenv
とvirtualenv
を同時に使用することができます。ただし、Python 3.3以降を使用している場合、pyenv-virtualenv
が利用可能であれば、virtualenv
ではなくpython -m venv
を実行しようとします。便利な機能が不要な場合は、pyenv-virtualenv
を付けずにvirtualenv
とpyenv
を一緒に使用できます。
virtualenvwrapper
は、virtualenv
の一連の拡張子です( docs を参照)。 mkvirtualenv
、lssitepackages
、特にworkon
ディレクトリ間で切り替えるためのvirtualenv
のようなコマンドを提供します。このツールは、複数のvirtualenv
ディレクトリが必要な場合に特に便利です。
pyenv-virtualenvwrapper
は、pyenv
と同じ作者によるpyenv
のプラグインで、virtualenvwrapper
をpyenv
に簡単に統合できます。
Kenneth Reitz(pipenv
の作者)によるrequests
は、このリストの最新プロジェクトです。コマンドラインでPipfile
、pip
、およびvirtualenv
を1つのコマンドにまとめることを目的としています。 virtualenv
ディレクトリは通常~/.local/share/virtualenvs/XXX
に配置され、XXX
はプロジェクトディレクトリのパスのハッシュです。これは、ディレクトリが通常は現在の作業ディレクトリにあるvirtualenv
とは異なります。
Pythonアプリケーションを開発するときのPythonパッケージングガイド pipenv
(ライブラリではなく)。 venv
( #15 )の代わりにvirtualenv
をサポートする予定はありません。混乱を招くように、そのコマンドラインオプション--venv
はvirtualenv
ではなくvenv
ディレクトリを参照し、同様に、環境変数PIPENV_VENV_IN_PROJECT
はvirtualenv
ディレクトリではなくvenv
ディレクトリの場所に影響します( #1919 )。
pyvenv
はPython 3に同梱されているスクリプトですが、問題があるので Python 3.6では廃止予定 です(わかりにくい名前は言うまでもありません)。 Python 3.6以降では、まったく同じものがpython3 -m venv
です。
venv
はPython 3に同梱されているパッケージで、python3 -m venv
を使って実行できます(ただし、何らかの理由でUbuntu/Debianのpython3-venv
などのディストリビューションに分割されている場合があります) )これはvirtualenv
と同様の目的で使用され、非常によく似た方法で機能しますが、Pythonバイナリをコピーする必要はありません(Windowsを除く)。 Python 2をサポートする必要がない場合はこれを使用してください。執筆時点では、Pythonコミュニティーはvirtualenv
に満足しているようで、私はvenv
についてあまり話していません。
これらのツールのほとんどは互いに補完し合っています。たとえば、pipenv
は、pip
、virtualenv
、および必要に応じてpyenv
を統合します。ここでお互いに本当の代替手段となる唯一のツールはvenv
とvirtualenv
です。
これは私が個人的に推奨する初心者のためのものです。virtualenv
とpip
、Python 2と3の両方で動作するさまざまな状況で使用するツールを学び、必要に応じて他のツールを選ぶことから始めます。
私はPython3.3以降のvirtualenv
の使用を避け、代わりに標準で出荷されているライブラリvenv
を使用します。新しい仮想環境を作成するには、次のように入力します。
$ python3 -m venv <MYVENV>
virtualenv
はPythonバイナリを仮想環境のbinディレクトリにコピーしようとします。ただし、そのバイナリに埋め込まれているライブラリファイルのリンクは更新されないため、Pythonを相対パス名を使用してソースからシステム以外のディレクトリに構築すると、Pythonバイナリが壊れます。これがあなたがコピー配布可能なPythonを作る方法であるので、それは大きな欠陥です。ところで、OS X上で埋め込みライブラリファイルのリンクを調べるには、otool
を使用してください。たとえば、仮想環境内から次のように入力します。
$ otool -L bin/python
python:
@executable_path/../Python (compatibility version 3.4.0, current version 3.4.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)
その結果、私はvirtualenvwrapper
とpipenv
を避けます。 pyvenv
は非推奨です。 pyenv
はvirtualenv
が使用される場所で頻繁に使用されるようですが、venv
はpyenv
のために構築されたものでもあると思うので、私はそれを避けます。
venv
は、シェル内に fresh および サンドボックス 、 ユーザーインストール可能なライブラリ という仮想環境を作成し、 multi-python safe とします。 Fresh 仮想環境はpythonに同梱されている標準ライブラリでしか始まらないため、仮想環境がアクティブな間はpip install
を使用して他のすべてのライブラリをもう一度インストールする必要があります。 サンドボックス これらの新しいライブラリのインストールは仮想環境の外には表示されないため、ベースのPythonインストールに影響を与えることを心配せずに環境全体を削除してやり直すことができます。 ユーザーがインストールできるライブラリ 仮想環境のターゲットフォルダは、すでに所有しているディレクトリにSudo
なしで作成されるため、ライブラリをインストールするのにSudo
権限は必要ありません。最後に、 multi-python safe です。仮想環境がアクティブになると、シェルはその仮想環境を構築するために使用されたpythonバージョン(3.4、3.5など)しか見えなくなります。
pyenv
は、複数のPython環境を管理できるという点でvenv
と似ています。しかしpyenv
では、ライブラリのインストールをある開始状態にロールバックすることができないため、ライブラリを更新するためにはadmin
特権が必要になる可能性があります。だから私はvenv
を使うのも最善だと思います。
ここ数年で、私はビルドシステム(emacsパッケージ、pythonスタンドアロンアプリケーションビルダー、インストーラー...)に多くの問題を発見しました。それらは最終的にvirtualenv
の問題に至ります。私たちがこの追加のオプションを排除してvenv
を使うとき、私はpythonがより良いプラットフォームになると思います。