私はactivateスクリプトをチェックしましたが、それは私に見えるだけです:
これらによって、virtualenv
はどのようにして魔法の仮想環境を提供しますか?私は何を見逃していますか?
@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
はこれらに基づいて構築されます。
これは主題について非常に良い プレゼンテーション です。基本的に、Ian Bickingが使用していたのと同じトリックを使用して、独自のvirtualenv
を作成する手順を説明します。
virtualenv myenv
コマンドを使用して新しいvirtualenvを作成します。これはmyenvというディレクトリを作成し、システムをコピーしますpythonバイナリをmyenv/binにコピーします。また、その他の必要なファイルとディレクトリを-に追加します- myenv、モジュールとパッケージのbin/activateおよびlibサブディレクトリにセットアップスクリプトを含む.. myenv/bin/activate
を使用してアクティブ化スクリプトを読み込み、シェルのPATH
環境変数をmyenv/binで始まるように設定します。python
を実行すると、myenv/binに格納されているバイナリのコピーが実行されます。バイナリは/ usr/bin/pythonのバイナリと同じですが、標準のpythonバイナリは、バイナリのパスに相対するディレクトリでパッケージとモジュールを検索するように設計されています(この機能../ lib/pythonX.Yを検索します。XとYは、pythonバイナリのメジャーバージョン番号とマイナーバージョン番号です。だから今はmyenv/lib/pythonX.Yを探しています。pip
という名前のスクリプトも含まれているため、ユーザーがvirtualenvからpipを使用して新しいパッケージをインストールすると、それらはmyenv/lib /にインストールされますpythonX.Y