1. ホーム
  2. python

[解決済み] Pythonでsys.pathを設定するのは何時ですか?

2023-07-08 17:52:39

質問

以下のコマンドを実行すると

import sys 
print sys.path

を私のMac (Mac OS X 10.6.5, Python 2.6.1) で実行すると、次のような結果が得られます。

/Library/Python/2.6/site-packages/ply-3.3-py2.6.egg
...
/Library/Python/2.6/site-packages/ipython-0.10.1-py2.6.egg
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages

/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

これらは5つのカテゴリに分類されています。

  • /Library/Python/2.6/site-packages/*.egg
  • /Library/Python/2.6/site-packages
  • フレームワーク/Python.framework/バージョン/2.6/lib/python2.6
  • フレームワーク/Python.framework/バージョン/2.6/Extras/lib/python
  • 環境変数PYTHONPATHからのPATH。

そして、私はコードを使ってさらにパスを追加することができます。

sys.path.insert(0, MORE_PATH)

  • どのルーチンが、いつ、それらのパスを設定するのでしょうか。
  • パスの一部はpythonのソースコードで構築されているのですか?
  • sys.path.insert'で挿入されたパスは無視されるのでしょうか?mod_wsgi で、'sys.path.insert' でパスが見つからないことがあったので、気になります。私が尋ねたのは 別記事 に質問させていただきました。

追加

マイケルの回答を元に、site.pyを調べてみると、以下のようなコードが出てきました。

def addsitepackages(known_paths):
    """Add site-packages (and possibly site-python) to sys.path"""
    sitedirs = []
    seen = []

    for prefix in PREFIXES:
        if not prefix or prefix in seen:
            continue
        seen.append(prefix)

        if sys.platform in ('os2emx', 'riscos'):
            sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
        elif sys.platform == 'darwin' and prefix == sys.prefix:
            sitedirs.append(os.path.join("/Library/Python", sys.version[:3], "site-packages"))

また、site.pyがあるディレクトリ名(Macでは/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6)はPythonソースコードに組み込まれるべきかと思います。

どのように解決するのですか?

ほとんどのものは、Pythonの site.py で起動しない限り)インタープリタを起動するときに自動的にインポートされます。 -S オプションで起動しない限り) インタープリタの起動時に自動的にインポートされます。初期化時にインタープリタ自身で設定されるパスはほとんどありません。 -S ).

さらに、いくつかのフレームワーク (Django のようなものだと思います) は sys.path を修正します。

site モジュールは、かなり良い ドキュメント があり、コメント付きの ソースコード で実行すると、いくつかの情報を出力します。 python -m site .