web-dev-qa-db-ja.com

virtualenvはどのように機能しますか?

私はactivateスクリプトをチェックしましたが、それは私に見えるだけです:

  • vIRTUAL_ENV envを設定
  • pATHの前に$ VIRTUAL_ENV/binを追加します

これらによって、virtualenvはどのようにして魔法の仮想環境を提供しますか?私は何を見逃していますか?

53
Drake Guan

@jcolladoのリンク先のプレゼンテーションから学んだ基本的なプロセスについて説明します。

Python=が起動すると、バイナリのパスとそのプレフィックスを調べます。

それでは、virtualenvが/home/blah/scratchであるとしましょう。 Pythonプロセスは、それが/home/blah/scratch/bin/pythonから実行されたことを認識しています(通常、これはシステムのコピーですpythonバイナリ/usr/bin/python)およびコンパイルされているため、独自のバージョンX.Yを認識しています。Pythonは、次の順序でlib/pythonX.Y/os.pyを検索します。

/home/blah/scratch/bin/lib/pythonX.Y/os.py
/home/blah/scratch/lib/pythonX.Y/os.py    <-- this file should exist
/home/blah/lib/pythonX.Y/os.py
/home/lib/pythonX.Y/os.py
/lib/pythonX.Y/os.py

実際に存在する最初のファイルなので、/home/blah/scratch/lib/pythonX.Y/os.pyで停止します。そうでない場合、Pythonは引き続き検索します。次に、これに基づいてsys.prefixを設定します。同様のプロセスを使用してsys.exec_prefixを設定し、次にsys.pathはこれらに基づいて構築されます。

51
Max

これは主題について非常に良い プレゼンテーション です。基本的に、Ian Bickingが使用していたのと同じトリックを使用して、独自のvirtualenvを作成する手順を説明します。

24
jcollado
  1. 最初に、ユーザーはvirtualenv myenvコマンドを使用して新しいvirtualenvを作成します。これはmyenvというディレクトリを作成し、システムをコピーしますpythonバイナリをmyenv/binにコピーします。また、その他の必要なファイルとディレクトリを-に追加します- myenv、モジュールとパッケージのbin/activateおよびlibサブディレクトリにセットアップスクリプトを含む.
  2. 次に、ユーザーは. myenv/bin/activateを使用してアクティブ化スクリプトを読み込み、シェルのPATH環境変数をmyenv/binで始まるように設定します。
  3. ユーザーがこのシェルからpythonを実行すると、myenv/binに格納されているバイナリのコピーが実行されます。バイナリは/ usr/bin/pythonのバイナリと同じですが、標準のpythonバイナリは、バイナリのパスに相対するディレクトリでパッケージとモジュールを検索するように設計されています(この機能../ lib/pythonX.Yを検索します。XとYは、pythonバイナリのメジャーバージョン番号とマイナーバージョン番号です。だから今はmyenv/lib/pythonX.Yを探しています。
  4. myenv/binディレクトリにはpipという名前のスクリプトも含まれているため、ユーザーがvirtualenvからpipを使用して新しいパッケージをインストールすると、それらはmyenv/lib /にインストールされますpythonX.Y
13
clark800