124

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 のパスより前のパスはどこから来るのだろうか?

4

2 に答える 2

104

Python は、 をインテリジェントに設定しようと本当に懸命に努力していますsys.path。設定方法は非常に複雑になる可能性があり ます。次のガイドは骨抜きで、多少不完全で、多少間違っていますが、Pythonsys.pathsys.executablesys.exec_prefixおよび通常のsys.prefixpython インストールで。

まず、Python は、オペレーティング システムからの指示に基づいて、ファイル システム上の実際の物理的な場所を把握するために最善を尽くします。OS が "python" が実行されていると言うだけの場合は、$PATH に自分自身を見つけます。シンボリック リンクを解決します。これが完了すると、見つかった実行可能ファイルのパスがsys.executable、no ifs、ands、または buts の値として使用されます。

次に、 と の初期値を決定しsys.exec_prefixます sys.prefix

pyvenv.cfg同じディレクトリ または 1 つ上のディレクトリに呼び出されたファイルがある場合sys.executable、python はそれを調べます。OS が異なれば、このファイルの処理も異なります。

Python が検索するこの構成ファイル内の値の 1 つは、構成オプションhome = <DIRECTORY>です。sys.executable Python は、後での初期値を動的に設定するときに、含むディレクトリの代わりにこのディレクトリを使用しますsys.prefixapplocal = true設定が pyvenv.cfgWindows のファイルに表示され、設定が表示されない場合はhome = <DIRECTORY>sys.prefixを含むディレクトリに設定されsys.executableます。

次に、PYTHONHOME環境変数が調べられます。Linux および Mac では sys.prefix、環境変数にsys.exec_prefix設定され、存在する場合は、 の設定よりも優先されます。Windows では 、環境変数が存在する場合は、環境変数に設定されます。設定が に存在しない場合は、代わりに使用されます。PYTHONHOMEhome = <DIRECTORY>pyvenv.cfgsys.prefixsys.exec_prefixPYTHONHOMEhome = <DIRECTORY>pyvenv.cfg

それ以外の場合は、の場所、または存在する場合は で指定されたディレクトリからさかのぼって検索しsys.prefixます。sys.exec_prefixsys.executablehomepyvenv.cfg

ファイルlib/python<version>/dyn-loadがそのディレクトリまたはその親ディレクトリのいずれかにある場合、そのディレクトリは sys.exec_prefixLinux または Mac に設定されます。ファイル lib/python<version>/os.pyがディレクトリまたはそのサブディレクトリのいずれかにある場合、そのディレクトリはsys.prefixLinux、Mac、および Windows 上にsys.exec_prefix設定され、Windows と同じ値に設定さ sys.prefixれます。が設定されている場合、Windows ではこの手順全体がスキップされます applocal = true。のディレクトリsys.executableが使用されるか、homeが に設定されている場合はpyvenv.cfg、 の初期値の代わりにそれが使用されますsys.prefix

これらの「ランドマーク」ファイルが見つからないかsys.prefix、まだ見つかっていない場合、python はsys.prefix「フォールバック」値に設定します。たとえば、Linux と Mac では、コンパイル済みの既定値がsys.prefixとの値として使用されますsys.exec_prefixsys.pathWindowsは、 のフォールバック値を設定するために が完全に把握される まで待機しsys.prefixます。

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

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

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

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

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

于 2016-07-15T19:19:54.580 に答える
52

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

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

于 2009-05-22T13:21:25.457 に答える