Pythonのsys.pathはどこから初期化されますか?
UPD:Pythonは、PYTHONPATHを参照する前にいくつかのパスを追加しています:
>>> import sys
>>> from pprint import pprint as p
>>> p(sys.path)
['',
'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.Egg',
'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.Egg',
'c:\\testdir',
'C:\\Windows\\system32\\python25.Zip',
'C:\\Python25\\DLLs',
'C:\\Python25\\lib',
'C:\\Python25\\lib\\plat-win',
'C:\\Python25\\lib\\lib-tk',
'C:\\Python25',
'C:\\Python25\\lib\\site-packages',
'C:\\Python25\\lib\\site-packages\\PIL',
'C:\\Python25\\lib\\site-packages\\win32',
'C:\\Python25\\lib\\site-packages\\win32\\lib',
'C:\\Python25\\lib\\site-packages\\Pythonwin']
私のPYTHONPATHは:
PYTHONPATH=c:\testdir
PYTHONPATHのパスの前にあるこれらのパスはどこから来たのだろうか?
「環境変数PYTHONPATHから初期化され、さらにインストールに依存するデフォルト」
Pythonは本当に sys.path
をインテリジェントに設定しようとします。設定方法は reallycomplicated になります。次のガイドは、ランク付けされたpythonプログラマーがpythonを見つけたときに何が起こるかについて、やや不完全で多少間違っているが、うまくいけば役に立つガイドです。 normalpythonインストールでsys.path
、sys.executable
、sys.exec_prefix
、およびsys.prefix
の初期値として使用するもの。
まず、pythonは、オペレーティングシステムからの指示に基づいて、ファイルシステム上の実際の物理的な場所を把握するために最善を尽くします。 OSが「python」が実行されているとだけ言った場合、$ PATHで検出されます。シンボリックリンクを解決します。これが完了すると、見つかった実行可能ファイルのパスがsys.executable
の値として使用され、if、ands、またはbutsは使用されません。
次に、sys.exec_prefix
およびsys.prefix
の初期値を決定します。
pyvenv.cfg
と同じディレクトリまたは1つ上のディレクトリにsys.executable
というファイルがある場合、pythonはそれを調べます。このファイルでは、OSごとに異なる処理が行われます。
pythonが検索するこの構成ファイルの値の1つは、構成オプションhome = <DIRECTORY>
です。 Pythonは、後でsys.executable
の初期値を動的に設定するときに、sys.prefix
を含むディレクトリの代わりにこのディレクトリを使用します。 applocal = true
設定がWindowsのpyvenv.cfg
ファイルに表示され、home = <DIRECTORY>
設定には表示されない場合、sys.prefix
はsys.executable
を含むディレクトリに設定されます。
次に、PYTHONHOME
環境変数が調べられます。 LinuxおよびMacでは、sys.prefix
およびsys.exec_prefix
は、PYTHONHOME
環境変数が存在する場合、supersedinghome = <DIRECTORY>
のすべてのpyvenv.cfg
設定に設定されます。 Windowsでは、sys.prefix
とsys.exec_prefix
がPYTHONHOME
環境変数に設定されます(存在する場合)unlesshome = <DIRECTORY>
設定はpyvenv.cfg
に存在し、代わりに使用されます。
それ以外の場合、これらのsys.prefix
とsys.exec_prefix
は、sys.executable
の場所、またはpyvenv.cfg
で指定されたhome
ディレクトリから逆方向に歩いて見つけることができます。
ファイルlib/python<version>/dyn-load
がそのディレクトリまたはその親ディレクトリのいずれかで見つかった場合、そのディレクトリはLinuxまたはMacでsys.exec_prefix
に設定されます。ファイルlib/python<version>/os.py
がディレクトリまたはそのサブディレクトリのいずれかで見つかった場合、そのディレクトリはLinux、Mac、およびWindowsではsys.prefix
に設定され、sys.exec_prefix
はWindowsのsys.prefix
と同じ値に設定されます。 applocal = true
が設定されている場合、Windowsではこのステップ全体がスキップされます。 sys.executable
のディレクトリが使用されるか、pyvenv.cfg
でhome
が設定されている場合は、代わりにsys.prefix
の初期値に使用されます。
これらの「ランドマーク」ファイルが見つからない場合、またはsys.prefix
がまだ見つからない場合、pythonはsys.prefix
を「フォールバック」値に設定します。たとえば、LinuxおよびMacでは、sys.prefix
およびsys.exec_prefix
の値としてプリコンパイル済みのデフォルトを使用します。 Windowsは、sys.path
のフォールバック値を設定するためにsys.prefix
が完全に計算されるまで待機します。
次に、(皆さんが待ち望んでいたもの)pythonは、sys.path
に含まれる初期値を決定します。
sys.path
に追加されます。 Windowsでは、これは常に空の文字列であり、pythonに代わりにスクリプトが配置されている場所のフルパスを使用するように指示します。sys.path
に追加され、Windowsを使用している場合unlessで、pyvenv.cfg
でapplocal
がtrueに設定されます。<prefix>/lib/python35.Zip
、Windowsではos.path.join(os.dirname(sys.executable), "python.Zip")
であるZipファイルのパスがsys.path
に追加されます。applocal = true
にpyvenv.cfg
が設定されていない場合、レジストリキーHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
のサブキーの内容があれば追加されます。applocal = true
がpyvenv.cfg
に設定されておらず、sys.prefix
が見つからなかった場合、レジストリキーHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
のcore contentsが存在する場合は追加されます。applocal = true
にpyvenv.cfg
が設定されていない場合、レジストリキーHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
のサブキーの内容があれば追加されます。applocal = true
がpyvenv.cfg
に設定されておらず、sys.prefix
が見つからなかった場合、レジストリキーHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
のcore contentsが存在する場合は追加されます。sys.prefix
を基準にして追加されます。sys.exec_prefix
の値が追加されます。 Windowsでは、sys.prefix
を動的に検索するために使用されていた(または使用されていた)ディレクトリが追加されます。Windowsのこの段階で、プレフィックスが見つからなかった場合、pythonは、sys.path
内のディレクトリでランドマークファイルを検索してallを決定しようとします。以前にsys.executable
のディレクトリを処理するには、何かが見つかるまで。そうでない場合、sys.prefix
は空白のままになります。
最後に、このすべての後、Pythonはsite
モジュールをロードします。これにより、sys.path
にさらに追加されます。
まず、先頭部分と末尾部分から最大4つのディレクトリを作成します。ヘッド部分には、
sys.prefix
とsys.exec_prefix
を使用します。空のヘッドはスキップされます。末尾部分では、空の文字列を使用してからlib/site-packages
(Windowsの場合)またはlib/pythonX.Y/site-packages
を使用してからlib/site-python
(UnixおよびMacintoshの場合)を使用します。個別のヘッドテールの組み合わせごとに、既存のディレクトリを参照しているかどうかを確認し、参照している場合はsys.pathに追加し、構成ファイルの新しく追加されたパスも検査します。