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


1025

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


20
そして、近い投票を回避するために、これはstackoverflow.com/questions/29950300/…よりも一般的な質問であると感じたので、その質問を編集したり、その投稿に過度に一般的な回答を投稿したりすることに抵抗がありました。
Flimm 2017年

12
:このガイドでは、便利&Pythonは、より&より「ワン&オンリー1明白な方法」物事を行うに追加し続けて常に更新の両方で docs.python-guide.org/en/latest/dev/virtualenvsを
マイケル

2
3.6の時点で、macOSのpyenv(私はpyNoobです)に比べてvirtualenvを機能させる方が簡単であることがわかりました
HashRocketSyntax

@HashRocketSyntax virtualenvpyenv同じ機能を実行していない、とお互いの代替ではありませんありません。私の答えを見てください。
Flimm 2018

7
私は、pipenvで一日を浪費しました。結論として、それは市場に出回っています。py2が必要な場合は、Venvとvirtualenvが適切なツールです。コンダ(フルスタックが必要ない場合はミニコンダ)も非常に優れています。非常に良い過去記事:chriswarrick.com/blog/2018/07/17/...
SwimBikeRun

回答:


1383

標準ライブラリにないPyPIパッケージ:

  • virtualenvPythonライブラリ用の分離されたPython環境を作成する非常に人気のあるツールです。このツールに慣れていない場合は、このツールを学習することを強くお勧めします。このツールは非常に便利なツールです。この回答の残りの部分では、このツールと比較します。

    ディレクトリ(例:)に一連のファイルをインストールしenv/PATH環境変数にカスタムbinディレクトリ(例:)をプレフィックスとして追加することで機能しますenv/bin/pythonまたはpython3バイナリの正確なコピーがこのディレクトリに配置されますが、Pythonは、最初に、パスに関連するライブラリを環境ディレクトリで探すようにプログラムされています。これはPythonの標準ライブラリの一部ではありませんが、PyPA(Python Packaging Authority)から正式に祝福されています。アクティブ化すると、を使用して仮想環境にパッケージをインストールできますpip

  • pyenvPythonのバージョンを分離するために使用されます。たとえば、Python 2.7、3.6、3.7、および3.8に対してコードをテストしたい場合があるので、それらを切り替える方法が必要になります。アクティブ化されると、PATH環境変数の前にが付けられます~/.pyenv/shims。ここには、Pythonコマンド(pythonpip)に一致する特別なファイルがあります。これらは、Pythonに付属するコマンドのコピーではありません。これらは、PYENV_VERSION環境変数、.python-versionファイル、またはファイルに基づいて実行するPythonのバージョンをその場で決定する特別なスクリプト~/.pyenv/versionです。pyenvまた、コマンドを使用すると、複数のPythonバージョンをダウンロードしてインストールするプロセスが簡単になりpyenv installます。

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

  • virtualenvwrapperは一連の拡張機能ですvirtualenvdocsを参照)。それはあなたのようなコマンドを与えmkvirtualenvlssitepackagesと特にworkon異なるの切り替えのためvirtualenvのディレクトリ。このツールは、複数のvirtualenvディレクトリが必要な場合に特に便利です。

  • pyenv-virtualenvwrapperためのプラグインですpyenvと同じ作者によるpyenv便利統合するため、virtualenvwrapperpyenv

  • pipenv結合することを目指しPipfilepipおよびvirtualenvコマンドライン上の1つのコマンドに組み込みます。virtualenv通常、ディレクトリはに配置され~/.local/share/virtualenvs/XXXXXXプロジェクトディレクトリのパスのハッシュになります。これはvirtualenv、ディレクトリが通常は現在の作業ディレクトリにあるとは異なります。pipenv(ライブラリではなく)Pythonアプリケーションを開発するときに使用することを目的としています。代替がありますpipenvなど、poetryこの質問だけでも同様に命名されたパッケージについてですので、私はここに表示されません。

標準ライブラリ:

  • pyvenvPython 3に付属しているスクリプトですが、問題があったため(混乱を招く名前は言うまでもありません)、Python 3.6では非推奨になりました。Python 3.6以降では、完全に同等のものはpython3 -m venvです。

  • venvは、Python 3に同梱されているパッケージであり、使用して実行できますpython3 -m venv(ただし、一部のディストリビューションではpython3-venv、Ubuntu / Debian などの別のディストリビューションパッケージに分割しています)。と同じ目的を果たしますが、virtualenvその機能のサブセットしかありません(こちらの比較を参照)。特に、前者はPython 2と3の両方をサポートしているため、virtualenvは引き続きより人気がvenvあります。

初心者向けの推奨事項:

これは、初心者のための私の個人的な推奨事項です。Python2 と3の両方で、さまざまな状況で機能するvirtualenvpipから学習し、必要になったら他のツールを選択します。


115
これはとても役に立ちます!では、なぜ1つではなく8つのもつれたものが存在するのでしょうか。(「それを行うには、1つ、できれば1つだけが明白な方法があるはずです。」-Pythonの禅)
Jerry101

59
@ Jerry101、venvの導入は、その混乱への対応の一部です。状況を改善したい場合は、venvを使用して、他の人にも同じことをすることをお勧めします。
Magnus Lind Oxlund

31
「venvの導入は、そのような混乱への対応の一部です」「Xのようなもの」を行うことが多すぎると、人々は常に「Xのようなもの」を行う別のことを行うことで、その混乱を改善できると常に考えます。 。実は面白いです。私たちは現在4年後です...ですから、質問するのは適切かもしれませんが、venv実際にその問題を解決しましたか?
クリス

34
間違いなく同じ領域を網羅しているリスト上の2つのツールはvirtualenvとvenvだけなので、いくつかの競合するツールによって引き起こされる混乱を扱っているという特徴付けはあまり正確ではありません。ただし、リストはいくつかの仮想環境関連のツールで構成されており、すべて同じような名前が付けられています。これは、特にそれらについて学習しているばかりのユーザーにとって、混乱を招く可能性があります。venvは状況を改善しましたか?他の仮想環境ツールに代わる、より軽量な代替手段を提供し、ネイティブの変更と標準ライブラリのスポットの恩恵を受けます。…
Magnus Lind Oxlund 2017年

11
@cowbert Python 3.5からPython 3.6にアップグレードしてすべてのvirtualenvを中断venvすると、新しいPythonバージョンに簡単にアップグレードできるようになります。
Daniel H

276

virtualenvPython3.3以降の使用は避け、代わりに標準の付属ライブラリを使用しますvenv。新しい仮想環境を作成するには、次のように入力します。

$ python3 -m venv <MYVENV>  

virtualenvPythonバイナリを仮想環境の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廃止予定です。pyenvどこvirtualenvで使うのが多いようですが、作り物venvもやっていると思うので遠ざけておきますpyenv

venv シェルに仮想環境を作成します 新鮮かつサンドボックスで、ユーザー取り付けのライブラリを、そして、それはだマルチのpython安全新鮮なのは、仮想環境がPythonに同梱されている標準ライブラリでのみ開始されるためpip install、仮想環境がアクティブな間に他のライブラリを最初からインストールし直す必要があるためです。これらの新しいライブラリのインストールは仮想環境の外には表示れないため、サンドボックス化されています。ベースのPythonインストールに影響を与えることを心配せずに、環境全体を削除して、最初からやり直すことができます。仮想環境のターゲットフォルダーが作成されないため、ユーザーがインストール可能なライブラリsudoすでに所有しているディレクトリにあるため、sudoライブラリをインストールするための権限は必要ありません。最後に、仮想環境がアクティブになると、シェルはその仮想環境の構築に使用されたpythonバージョン(3.4、3.5など)しか認識しないためマルチpythonセーフです。

pyenvvenv複数のpython環境を管理できるという点で似ています。ただし、pyenvライブラリのインストールを開始状態に都合よくロールバックすることはできないため、adminライブラリを更新するには、ある時点で特権が必要になる可能性があります。なので、使うのもいいと思いますvenv

ここ数年、私はビルドシステム(emacsパッケージ、pythonスタンドアロンアプリケーションビルダー、インストーラー...)に多くの問題を発見しましたvirtualenv。この追加オプションを削除してのみを使用する場合、pythonはより良いプラットフォームになると思いますvenv


3
add2virtualenvの下にPYTHONPATHカスタム_virtualenv_path_extensions.pthファイルを追加して、を微調整しますsite-packages。または、仮想環境をアクティブにするたびに呼び出すファイルのPYTHONPATH環境変数を更新することもできbin/activateます。またはsite-packages、追加のディレクトリを指すようにシンボリックリンクを追加することもできます。これらの選択肢はどちらも、開発者がトラブルシューティングに広く使用している従来のコマンドラインツールに対して透過的です。.pthドキュメントに記載されていない名前のカスタムを使用すると、より魔法のIMOのように見えます。
Riaz Rizvi 2018年

15
承知しました。stackoverflow.com/ questions / 48130371 / …でPYTHONPATH、の必要性を回避するための正しいアップデートであることを確認しましたadd2virtualenv。最初のコメントからのSOの支援の欠如に関して、あなたの投稿をトラブルシューティングするように人々を動機付けるために、私の唯一の提案は、彼らがあなたの問題を解決する場合の賛成投票です?マウスクリックと引き換えに30時間の調査+書き込み?良い取引のように
聞こえ

7
いいえ、あなたは正解です。私は賛成投票に力を入れようとします。一体、あなたが私の地域にいれば、私はあなたにビールを買うでしょう。私は約束を守り、Pythonドキュメントの担当者が変更を/ bin / activateに追加して、明確にするために公式ドキュメントを追加できるかどうかを確認します。私は素晴らしくはありませんが、Pythonにひどいわけではありません。私にとってそれが困難だったとしたら...とにかく、お時間をいただきありがとうございます。
SteveJ

9
@ MalikA.Rumiの祝福は、「私たちや他の人たちに熱心に売り込まれたPipenv作成者にまでわずかに削減されました。そのため、私たちはPipenvについて言及しています」。
ロブ・グラント

6
@AndreaMoro pyvenvは非推奨ですpyenv。これらのツールの名前と混同するのはとても簡単です。
ダニエルホームズ

25

私はpipenvうさぎの穴を掘り下げましたそれは確かに深くて暗い穴です...、最後の回答が2年以上前なので、Python仮想エンベロープのトピックに関する最新の開発でディスカッションを更新するのに役立つと感じました見つけた。

免責事項:

この答えは、エンベロープソリューションとしてのpipenvvenvのメリットについての激しい議論を続けることについてではありません私はどちらも推奨ません。それはPyPAが矛盾する標準を承認し、virtualenvの将来の開発がそれらの間のいずれかまたは両方の選択を否定することを約束する方法についてです。これら2つのツールに焦点を当てたのは、これらがPyPAによって油をそそがれたツールだからです

venv

OPが指摘するように、envは環境を仮想化するためのツールです。NOTサードパーティのソリューションが、ネイティブツール。PyPA是認venv作成するためのVIRTUAL封筒:「バージョン3.5で変更:venvの使用は、現在の仮想環境を作成するための推奨されます」。

Pipenv

pipenvは -のよう venv -仮想封筒が、さらにロールインパッケージ管理と作成するために使用することができる脆弱性チェック機能を。を使用する代わりにrequirements.txt Pipfilepipenvを介してパッケージ管理を提供します。以下のよう PyPAがためpipenv是認パッケージ管理を暗示するように見えるだろう、取って代わることです。pipfilerequirements.txt

もつともpipenvの用途はVIRTUALENV、仮想封筒を作成するためのツールとして、NOT venvによって承認されたPyPA仮想封筒を作成するためのゴーへのツールとして。

矛盾する基準:

したがって、仮想エンベロープソリューションの解決が十分ではなかった場合、PyPAは、異なる仮想エンベロープソリューションを使用する2つの異なるツールを承認するようになりました。この競合を強調するvenvvirtualenvに関する激しいGithubの議論はここにあります

紛争解決:

上記のリンクで参照されているGithubの議論により、virtualenvの開発は、将来のリリースでvenvに対応する方向に進んいます

組み込みのvenvを優先します。ターゲットpythonにvenvがある場合は、それを使用して環境を作成します(その後、それに続く操作を実行して、提供する他の保証を容易にします)。

結論:

したがって、2つのライバルの仮想エンベロープソリューション間に将来の収束があるように見えますが、現時点では、pipenv-を使用virtualenv- はと大きく異なりますvenv

与えられた問題pipenv解きと事実PyPAはその祝福を与えている、表示され、明るい未来を持っています。場合とvirtualenvのは、その提案、開発目標に実現し、仮想封筒のソリューションを選択することは、もはやどちらかの場合あってはならないpipenv OR venv


6
私が理解したことから:pipenvの実際の値はすでにしばらく議論されており、1年以上リリースされていません。それ以来多くの変化があり、それはpipenvでのみ悪化したと私は主張します(pipツールなどのツールはより良い形になっています)。PyPAのページは時代遅れであり、私は彼らが降格すべき主張するだろうpipenvをvenvは標準ツールであるため、非常に効率的ですが、機能のセットが制限されています。virtualenvvenvと競合しませんが、env移動できない、または移動したくない領域をカバーしようとします(それが標準であるため)。
sinorocの

@sinoroc私の投稿はメリットやpipenvに関するものではありませんでした。PyPAがpipenv venvの両方を推奨するという矛盾するガイダンスがエンベロープソリューションの選択をより困難にし、ある程度の収束がどのように収束するように見えるかによって、選択の必要性が否定されます。それらの間で。私は何も支持していないことに注意してください。PyPAによって支持されたこれら2つのソリューションがどのように進化しているかについて私が学んだことを共有しただけです。彼らのようにかどうかは無関係になり、私かどうか、それらでPyPAの関心を考える:pipenvとvenvが見えたそうな風景の一部になるために
F1Linux

9
私は可能な限りvenvpipに固執するように言います。これら2つはそのままです。venvはPythonの標準ライブラリの一部であり、Pythonで(ensurepipを介して)提供されているため、ある意味ピップでもあります。他のツール(pyenvシリーズは別です:まったく別のもの)は、venvおよびpipに依存しているか、または(多かれ少なかれ成功して)エミュレートしているようです。それは素晴らしいです。しかし、事態が悪化した場合、venvpipが安全なフォールバックです。私が使用する他の唯一のツールはtoxtox-venv)仮想環境の作成と入力を支援するため(わかりやすく、魔法はなく、奇妙なことにまだ言及されていません)。
sinoroc

3
この最新の投稿は、しわを解決するのに素晴らしい仕事をしたので、金です。システムpythonがアップグレードされたときにvirtualenvを使用してバイナリのダングリングに問題があったため、pipとvenvを使用しています。
codeviper

1
過去にエラーでpipenv nonverboseの問題に遭遇しました。アーグルと溝。また、chriswarrick.com
blog

4

2020年4月の更新

私がこの投稿に出くわしたとき、私は同じものを探していました。どのツールを使用するかというこの問題は、私のような新しいPythonユーザーにとって非常に混乱し、難しいと思います。これは、pipenvに関するPyPA Webサイトから直接です。

このチュートリアルでは、pipenvプロジェクトを、主にPythonライブラリ開発ではなくPythonアプリケーション開発のニーズに焦点を当てたツールとして扱いますが、プロジェクト自体は現在、バグ修正や新機能の公開を妨げているいくつかのプロセスとメンテナンスの問題に取り組んでいます( 2019年全体が新しいリリースなしで通過しています)。つまり、近い将来、pipenvには、問題の解決のための明確なタイムラインがなくても、いくつかの癖やパフォーマンスの問題が残っています。

これは現状のままですが、プロジェクトのメンテナは、pipenvの代わりに、またはpipenvと一緒に使用するために、アプリケーションの依存関係を管理するための他のツールを調査する可能性があります。

2020年4月のpipenvリリースが計画どおりに進行し、その後のリリースも順調に進んでいると想定すると、チュートリアルに関するこの警告は削除されます。これらのリリースが予定どおりに進まない場合、チュートリアル自体は削除され、使用可能な依存関係管理オプションに関するディスカッションページに置き換えられます。


pipenvは現在(つまり2020年5月に)2020年4月リリースのプレリリースにまだあるようです。こちらをご覧ください
andrewjames

これは質問の答えにはなりません。
Flimm

@Flimmは質問によく答えたと思います。私はF1Linuxの返答に応じていました
Arnuld

1
2020年6月4日の時点で、pipenvチームはは、PyPIに2つのバージョンをリリースしました。2020.5.28最近になって、そして2020.6.2pypi.org/project/pipenv/#history
虚無
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.