web-dev-qa-db-ja.com

Venv、pyvenv、pyenv、virtualenv、virtualenvwrapper、pipenvなどの違いは何ですか?

Python 3.3の標準ライブラリには、新しいパッケージvenvが含まれています。それは何をするのか、そして正規表現(py)?(v|virtual|pip)?envにマッチするように見える他のすべてのパッケージとどう違うのですか?

619
Flimm

PyPIパッケージは標準ライブラリにはありません:

  • 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コマンド(PATHpython)と一致する特殊ファイルがある~/.pyenv/shimsが環境変数pipの前に付けられます。これらはPythonが出荷したコマンドのコピーではありません。これらは、PYENV_VERSION環境変数、.python-versionファイル、または~/.pyenv/versionファイルに基づいて実行するPythonのバージョンをその場で決定する特別なスクリプトです。 pyenvは、コマンドpyenv installを使用して、複数のバージョンのPythonをダウンロードおよびインストールするプロセスも容易にします。

  • pyenv-virtualenvは、pyenvと同じ作者によるpyenvのプラグインで、便利にpyenvvirtualenvを同時に使用することができます。ただし、Python 3.3以降を使用している場合、pyenv-virtualenvが利用可能であれば、virtualenvではなくpython -m venvを実行しようとします。便利な機能が不要な場合は、pyenv-virtualenvを付けずにvirtualenvpyenvを一緒に使用できます。

  • virtualenvwrapperは、virtualenvの一連の拡張子です( docs を参照)。 mkvirtualenvlssitepackages、特にworkonディレクトリ間で切り替えるためのvirtualenvのようなコマンドを提供します。このツールは、複数のvirtualenvディレクトリが必要な場合に特に便利です。

  • pyenv-virtualenvwrapperは、pyenvと同じ作者によるpyenvのプラグインで、virtualenvwrapperpyenvに簡単に統合できます。

  • Kenneth Reitz(pipenvの作者)によるrequestsは、このリストの最新プロジェクトです。コマンドラインでPipfilepip、およびvirtualenvを1つのコマンドにまとめることを目的としています。 virtualenvディレクトリは通常~/.local/share/virtualenvs/XXXに配置され、XXXはプロジェクトディレクトリのパスのハッシュです。これは、ディレクトリが通常は現在の作業ディレクトリにあるvirtualenvとは異なります。

    Pythonアプリケーションを開発するときのPythonパッケージングガイド pipenv (ライブラリではなく)。 venv#15 )の代わりにvirtualenvをサポートする予定はありません。混乱を招くように、そのコマンドラインオプション--venvvirtualenvではなくvenvディレクトリを参照し、同様に、環境変数PIPENV_VENV_IN_PROJECTvirtualenvディレクトリではなく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は、pipvirtualenv、および必要に応じてpyenvを統合します。ここでお互いに本当の代替手段となる唯一のツールはvenvvirtualenvです。

初心者向けのおすすめ:

これは私が個人的に推奨する初心者のためのものです。virtualenvpip、Python 2と3の両方で動作するさまざまな状況で使用するツールを学び、必要に応じて他のツールを選ぶことから始めます。

926
Flimm

私は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)

その結果、私はvirtualenvwrapperpipenvを避けます。 pyvenvは非推奨です。 pyenvvirtualenvが使用される場所で頻繁に使用されるようですが、venvpyenvのために構築されたものでもあると思うので、私はそれを避けます。

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がより良いプラットフォームになると思います。

153
Riaz Rizvi