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


111

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のパスの前のパスはどこから来るのでしょうか。

回答:


49

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

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


7
私はそれらがサイトモジュールから来ていると思います: docs.python.org/library/site.html
ashcatch

20
サイトモジュールは、サイトパッケージディレクトリ内の.pthファイルのコンテンツをロードして解析します。これらの.pthファイルには、PYTHONPATHへの追加が含まれています
ASk

77

Pythonは、インテリジェントに設定しようと真剣に取り組んでいsys.pathます。設定方法は非常に 複雑になる可能性があります。以下のガイドはPythonの数字は何として使用するために出たときに何が起こるかのランクとファイルのPythonプログラマのための水で薄めた、やや不完全、やや-間違って、うまくいけば、有用な指針である初期値sys.pathsys.executablesys.exec_prefix、およびsys.prefix上の通常 のpythonのインストール。

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

次に、それはのための初期値を決定sys.exec_prefixして sys.prefix

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

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

次に、PYTHONHOME環境変数が調べられます。LinuxやMac上、 sys.prefixおよびsys.exec_prefixに設定されているPYTHONHOME、それは、存在する場合は、環境変数取って代わるどんなhome = <DIRECTORY>の設定をpyvenv.cfg。Windowsでは、 sys.prefixsys.exec_prefixに設定されているPYTHONHOME、それは、存在する場合は、環境変数がない限りhome = <DIRECTORY>設定が存在であるpyvenv.cfg代わりに使用され、。

それ以外の場合は、これらsys.prefixとはsys.exec_prefixの場所から逆方向に歩いて発見されたsys.executable、またはhomeで指定されたディレクトリpyvenv.cfgがあれば。

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

これらの「ランドマーク」ファイルsys.prefixが見つからないか、まだ見つからない場合、pythonはsys.prefix「フォールバック」値を設定します。値としてLinuxおよびMac、例えば、使用するコンパイル済みのデフォルトsys.prefixsys.exec_prefix。Windows sys.pathは、がフォールバック値を設定するために完全に理解されるまで待機し 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およびos.path.join(os.dirname(sys.executable), "python.zip")Windows 上 のzipファイルパスがに追加されsys.pathます。
  4. Windowsで、に何applocal = trueも設定されていない場合pyvenv.cfgは、レジストリキーのサブキーのコンテンツが HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\あれば追加されます。
  5. Windows上となした場合は、applocal = trueに設定されたpyvenv.cfg、そしてsys.prefix、その後、見つかりませんでしたコアコンテンツレジストリキーののをHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\、それが存在する場合、追加されます。
  6. Windowsで、に何applocal = trueも設定されていない場合pyvenv.cfgは、レジストリキーのサブキーのコンテンツが HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\あれば追加されます。
  7. Windows上となした場合は、applocal = trueに設定されたpyvenv.cfg、そしてsys.prefix、その後、見つかりませんでしたコアコンテンツレジストリキーののをHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\、それが存在する場合、追加されます。
  8. WindowsでPYTHONPATHが設定されておらず、プレフィックスが見つからず、レジストリキーが存在しない場合、PYTHONPATHの相対的なコンパイル時の値が追加されます。それ以外の場合、このステップは無視されます。
  9. コンパイル時マクロPYTHONPATHのパスは、動的に検出されたを基準にして追加されsys.prefixます。
  10. MacおよびLinuxでは、の価値sys.exec_prefixが追加されます。Windowsでは、動的に検索するために使用された(または使用されたはずの)ディレクトリsys.prefixが追加されます。

Windowsのこの段階で、接頭辞が見つからなかった場合、Pythonは、以前のディレクトリで行ったように、すべてのディレクトリでsys.pathランドマークファイルを検索してsys.executable何かが見つかるまでそれを特定しようとします。そうでない場合は、sys.prefix空白のままにします。

最後に、このすべての後、Pythonはsiteモジュールをロードしますsys.path

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


1
そのドキュメントが言っていることにもかかわらずsys.executable、シンボリックリンクにすることができますし、実際にargv[0]はスラッシュが含まれていれば何でも構いません。(呼び出しからの)実行可能ファイルへの実際のパスexecv(path, argv)は使用されません。
jfs

1
sys.pathWindows 10の最初のポイントについて:私は常にsys.path [0](cwd ''ではなく)としてスクリプトディレクトリの完全パスを取得します。次のようなものを実行できるはずですpython some\other\path\than\cwd\main.py
ford04

@ ford04に同意します。ポイント1は正しくありません。Windowsでは、スクリプトのディレクトリは、空のパスやcwdではなく、sys.pathに追加されます。これは、さまざまなPython 3.xインストールにあります。
gwideman

1
わあ、これはすごい!これを偶然目にする前に、他に約10の質問と回答、つまり「真実」を見ました。
マイクウィリアムソン、

1
私はその関連ファイルをsite-packages持っている.pth.egg-linkサフィックスに追加します。
florisla
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.