2

私はsageからipythonを実行しており、ホームディレクトリにインストールされているsageにないパッケージ(lxml、argparse)も使用しています。したがって、$PYTHONPATHは

$ HOME / sage / local / lib / python:$ HOME / lib / python

Pythonは、最初に見つかったeasy-install.pth($ HOME / sage / local / lib / python / site-packages / easy-install.pth)を読み取って処理していますが、2番目は処理していないため、卵は$ HOME /lib/にインストールされます。 pythonはパスに追加されません。既成のsite.pyを読んでいると、私は一生の間、なぜこれが行われているのかわかりません。

誰かが私を啓発できますか?または、Pythonをナッジして両方のeasy-install.pthファイルを読み取る方法をアドバイスしますか?

両方を1つの.pthファイルに統合することは、現時点では実行可能な回避策であるため、この質問は主に好奇心の価値に関するものです。

4

1 に答える 1

1

TL; DR:site.addsitedirを呼び出して、.pthファイルを処理します


OS Xについてはよくわかりませんが、PYTHONPATHとサイトパッケージは、sys.pathの拡張に関しては実際には一種の独立しています。

Try this:
    set PYTHONPATH somehow (OS dependent)
    python -c "import sys; print '\n'.join(sys.path); print sys.exec_prefix; print sys.prefix"
    python -S -c "import sys; print '\n'.join(sys.path);print sys.exec_prefix; print sys.prefix"

私のLinuxボックスでは、2回目の実行で-Sスイッチがサイトモジュールのインポートをスキップしたとしても、PYTHONPATHは両方の時間で出力の一部になります。

ここで、site.moduleが行うことは、実際には(sys.exec_prefix、sys.prefix)とOSに依存するプレフィックス(Linuxの場合:lib / python2.7 / dist-packages)の組み合わせを取り、組み合わせのいずれかが既存のディレクトリであるかどうかを確認することです。 、その場合はそれを処理します(含まれている.pthファイルの解析)

コードはsite.pyモジュール--getsitepackages()にあります。

def getsitepackages():
    """Returns a list containing all global site-packages directories
    (and possibly site-python).

    For each directory present in the global ``PREFIXES``, this function
    will find its `site-packages` subdirectory depending on the system
    environment, and will return a list of full paths.
    """
    sitepackages = []
    seen = set()

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

        if sys.platform in ('os2emx', 'riscos'):
            sitepackages.append(os.path.join(prefix, "Lib", "site-packages"))
        elif os.sep == '/':
            sitepackages.append(os.path.join(prefix, "lib",
                                        "python" + sys.version[:3],
                                        "site-packages"))
            sitepackages.append(os.path.join(prefix, "lib", "site-python"))
        else:
            sitepackages.append(prefix)
            sitepackages.append(os.path.join(prefix, "lib", "site-packages"))
        (...)

この関数は最終的にリストを返し、そのリストの各要素に対してaddsitedir関数が呼び出されます。この関数には、.pthファイルを機能させるためのロジックがあります。

非常に長い話ですが、.pthファイルを処理するには、エントリレベルのスクリプトでsite.addistedirを呼び出します。また、sitecustomize.pyに含めることを検討することもできます。Pythonディストリビューションにまだ含まれていないことを確認してください。

于 2012-03-03T23:25:22.973 に答える