virtualenvは環境変数を変更することで、仮想環境を作り出しているらしい。
そこで、
環境変数とはどういうもので、
Pythonではどう使われていて、
virtualenvではどう使われているのか
について、少し調べてみた。たぶん間違いもあると思います。
環境変数とは
一言で言えば、Windowsシステム全体のプログラムが共有する変数のこと。
Windowsシステムが使用する環境変数は、特別な意味を持つ。 例えばPATH変数は、「プログラムを実行するときにそのフォルダを探す」という意味を持つ。
環境変数をマスターする [Javaプログラミング] All About
virtualenv絡みでは、PYTHONPATH と PYTHONHOME がよく出てくるので、それについて調べてみる。
PYTHONが使う環境変数
まとめると、こんな意味らしい。
PYTHONHOMEは Pythonに共通で含まれる標準ライブラリのパスを、 PYTHONPATHは Pythonに追加されるモジュールファイルの検索パスを追加するらしい。
PYTHONHOME(原文)
標準 Python ライブラリの場所を変更します。デフォルトでは、ライブラリは prefix/lib/pythonversion と exec_prefix/lib/pythonversion から探されます。ここで、 prefix と exec_prefix はインストール依存のディレクトリで、両方共デフォルトでは /usr/local です。 PYTHONHOME が1つのディレクトリに設定されている場合、その値は prefix と exec_prefix の両方を置き換えます。それらに別々の値を指定したい場合は、 PYTHONHOME を prefix:exec_prefix のように指定します。
PYTHONPATH(原文)
モジュールファイルのデフォルトの検索パスを追加します。この環境変数のフォーマットはシェルの PATH と同じで、 os.pathsep (Unix ならコロン、 Windows ならセミコロン) で区切られた1つ以上のディレクトリパスです。存在しないディレクトリは警告なしに無視されます。 通常のディレクトリに加えて、 PYTHONPATH のエントリはピュアPython モジュール(ソース形式でもコンパイルされた形式でも) を含む zip ファイルを参照することもできます。拡張モジュールは zip ファイルの中から import することはできません。 デフォルトの検索パスはインストール依存ですが、通常は prefix/lib/pythonversion で始まります。 (上の PYTHONHOME を参照してください。) これは 常に PYTHONPATH に追加されます。 上の インターフェイスオプション で説明されているように、追加の検索パスディレクトリが PYTHONPATH の手前に追加されます。検索パスは Python プログラムから sys.path 変数として操作することができます。
[http://docs.python.jp/2/using/cmdline.html#using-on-envvars:title]
ちなみに、実行中のPythonインタプリタから上記pathを調べるには、インタプリタ上で
import sys sys.path
を打てばOK。
ここで出てくるpathは、このように決まっているらしい。
カレントディレクトリを自動的に登録する。最初の空文字列”がこれです。 環境変数PYTHONPATHがあれば、そこに指定されたディレクトリを登録する。 レジストリにPythonPathエントリがあれば、そこで指定されたディレクトリを登録する。 環境変数PYTHONHOMEが設定されていれば、そこから、なければ、python.exeのあるディレクトリから、Lib\os.pyを特定し、PYTHONHOMEを推定して、必要なサブディレクトリをsys.pathに登録する。 PYTHONHOMEもPYTHONPATHも特定できず、レジストリのエントリもない場合は、デフォルトの相対パスが使われる。 モジュール検索パスに、拡張子 .pth のファイルがあれば、そこに書かれたパス(相対パスでも絶対パスでもよい)を、sys.path の最後に付け加える。
Python2.7 と Python3.3 を Windows で併用する | ユニマージュ
virtualenvがやっていること
activate.batをちょっと見てみたけど、理解できず中断。
期待された方、ごめんなさい。
わかる方、教えてください。