web-dev-qa-db-ja.com

Pythonのsys.pathはどこから初期化されますか?

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のパスの前にあるこれらのパスはどこから来たのだろうか?

94
Alex

「環境変数PYTHONPATHから初期化され、さらにインストールに依存するデフォルト」

- http://docs.python.org/library/sys.html#sys.path

44
dfa

Pythonは本当に sys.path をインテリジェントに設定しようとします。設定方法は reallycomplicated になります。次のガイドは、ランク付けされたpythonプログラマーがpythonを見つけたときに何が起こるかについて、やや不完全で多少間違っているが、うまくいけば役に立つガイドです。 normalpythonインストールでsys.pathsys.executablesys.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.prefixsys.executableを含むディレクトリに設定されます。

次に、PYTHONHOME環境変数が調べられます。 LinuxおよびMacでは、sys.prefixおよびsys.exec_prefixは、PYTHONHOME環境変数が存在する場合、supersedinghome = <DIRECTORY>のすべてのpyvenv.cfg設定に設定されます。 Windowsでは、sys.prefixsys.exec_prefixPYTHONHOME環境変数に設定されます(存在する場合)unlesshome = <DIRECTORY>設定はpyvenv.cfgに存在し、代わりに使用されます。

それ以外の場合、これらのsys.prefixsys.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.cfghomeが設定されている場合は、代わりにsys.prefixの初期値に使用されます。

これらの「ランドマーク」ファイルが見つからない場合、またはsys.prefixがまだ見つからない場合、pythonはsys.prefixを「フォールバック」値に設定します。たとえば、LinuxおよびMacでは、sys.prefixおよびsys.exec_prefixの値としてプリコンパイル済みのデフォルトを使用します。 Windowsは、sys.pathのフォールバック値を設定するためにsys.prefixが完全に計算されるまで待機します。

次に、(皆さんが待ち望んでいたもの)pythonは、sys.pathに含まれる初期値を決定します。

  1. pythonが実行しているスクリプトのディレクトリがsys.pathに追加されます。 Windowsでは、これは常に空の文字列であり、pythonに代わりにスクリプトが配置されている場所のフルパスを使用するように指示します。
  2. PYTHONPATH環境変数の内容は、設定されている場合、sys.pathに追加され、Windowsを使用している場合unlessで、pyvenv.cfgapplocalがtrueに設定されます。
  3. Linux/Macでは<prefix>/lib/python35.Zip、Windowsではos.path.join(os.dirname(sys.executable), "python.Zip")であるZipファイルのパスがsys.pathに追加されます。
  4. Windowsでapplocal = truepyvenv.cfgが設定されていない場合、レジストリキーHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\のサブキーの内容があれば追加されます。
  5. Windowsでapplocal = truepyvenv.cfgに設定されておらず、sys.prefixが見つからなかった場合、レジストリキーHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\core contentsが存在する場合は追加されます。
  6. Windowsでapplocal = truepyvenv.cfgが設定されていない場合、レジストリキーHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\のサブキーの内容があれば追加されます。
  7. Windowsでapplocal = truepyvenv.cfgに設定されておらず、sys.prefixが見つからなかった場合、レジストリキーHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\core contentsが存在する場合は追加されます。
  8. Windowsで、PYTHONPATHが設定されておらず、プレフィックスが見つからず、レジストリキーが存在しない場合、PYTHONPATHの相対的なコンパイル時の値が追加されます。それ以外の場合、この手順は無視されます。
  9. コンパイル時マクロPYTHONPATHのパスは、動的に検出されたsys.prefixを基準にして追加されます。
  10. MacおよびLinuxでは、sys.exec_prefixの値が追加されます。 Windowsでは、sys.prefixを動的に検索するために使用されていた(または使用されていた)ディレクトリが追加されます。

Windowsのこの段階で、プレフィックスが見つからなかった場合、pythonは、sys.path内のディレクトリでランドマークファイルを検索してallを決定しようとします。以前にsys.executableのディレクトリを処理するには、何かが見つかるまで。そうでない場合、sys.prefixは空白のままになります。

最後に、このすべての後、Pythonはsiteモジュールをロードします。これにより、sys.pathにさらに追加されます。

まず、先頭部分と末尾部分から最大4つのディレクトリを作成します。ヘッド部分には、sys.prefixsys.exec_prefixを使用します。空のヘッドはスキップされます。末尾部分では、空の文字列を使用してからlib/site-packages(Windowsの場合)またはlib/pythonX.Y/site-packagesを使用してからlib/site-python(UnixおよびMacintoshの場合)を使用します。個別のヘッドテールの組み合わせごとに、既存のディレクトリを参照しているかどうかを確認し、参照している場合はsys.pathに追加し、構成ファイルの新しく追加されたパスも検査します。

63
djhaskin987