Python は、 をインテリジェントに設定しようと本当に懸命に努力していますsys.path
。設定方法は非常に複雑になる可能性があり ます。次のガイドは骨抜きで、多少不完全で、多少間違っていますが、Pythonが、sys.path
、
sys.executable
、sys.exec_prefix
および通常のsys.prefix
python
インストールで。
まず、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.prefix
。applocal = true
設定が
pyvenv.cfg
Windows のファイルに表示され、設定が表示されない場合はhome = <DIRECTORY>
、sys.prefix
を含むディレクトリに設定されsys.executable
ます。
次に、PYTHONHOME
環境変数が調べられます。Linux および Mac では
sys.prefix
、環境変数にsys.exec_prefix
設定され、存在する場合は、 の設定よりも優先されます。Windows では
、環境変数が存在する場合は、環境変数に設定されます。設定が に存在しない場合は、代わりに使用されます。PYTHONHOME
home = <DIRECTORY>
pyvenv.cfg
sys.prefix
sys.exec_prefix
PYTHONHOME
home = <DIRECTORY>
pyvenv.cfg
それ以外の場合は、の場所、または存在する場合は で指定されたディレクトリからさかのぼって検索しsys.prefix
ます。sys.exec_prefix
sys.executable
home
pyvenv.cfg
ファイルlib/python<version>/dyn-load
がそのディレクトリまたはその親ディレクトリのいずれかにある場合、そのディレクトリは
sys.exec_prefix
Linux または Mac に設定されます。ファイル
lib/python<version>/os.py
がディレクトリまたはそのサブディレクトリのいずれかにある場合、そのディレクトリはsys.prefix
Linux、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_prefix
。sys.path
Windowsは、 のフォールバック値を設定するために が完全に把握される
まで待機しsys.prefix
ます。
次に、(皆さんが待ち望んでいたことです) python は、 に含まれる初期値を決定しますsys.path
。
- に python が実行しているスクリプトのディレクトリを追加し
sys.path
ます。Windows では、これは常に空の文字列であり、代わりにスクリプトが配置されているフル パスを使用するように python に指示します。
- PYTHONPATH 環境変数の内容が設定されている場合は、Windows を使用していて で true に設定されている場合を除き
sys.path
、に追加されます。applocal
pyvenv.cfg
<prefix>/lib/python35.zip
Linux/Mac および
Windows にある zip ファイル パスos.path.join(os.dirname(sys.executable), "python.zip")
が に追加されsys.path
ます。
- Windows で に no
applocal = true
が設定されている場合pyvenv.cfg
、レジストリ キーのサブキーの内容が
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
あれば、それが追加されます。
- Windows で no
applocal = true
が に設定されていpyvenv.cfg
てsys.prefix
見つからなかった場合、レジストリ キーのコア コンテンツHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
が存在する場合は追加されます。
- Windows で に no
applocal = true
が設定されている場合pyvenv.cfg
、レジストリ キーのサブキーの内容が
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
あれば、それが追加されます。
- Windows で no
applocal = true
が に設定されていpyvenv.cfg
てsys.prefix
見つからなかった場合、レジストリ キーのコア コンテンツHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
が存在する場合は追加されます。
- Windows で PYTHONPATH が設定されておらず、プレフィックスが見つからず、レジストリ キーが存在しない場合、PYTHONPATH の相対的なコンパイル時の値が追加されます。それ以外の場合、この手順は無視されます。
- コンパイル時マクロ PYTHONPATH 内のパスは、dynamic-found に対して相対的に追加され
sys.prefix
ます。
- 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 に追加し、新しく追加された構成ファイルのパスも調べます。