26

Python パッケージの「インポート名」/名前空間を取得するための信頼できる一貫した方法があるかどうか疑問に思います。例えば;

パッケージ; django-haystack
インポート名; 干し草の山

また

パッケージ; ipython
インポート名; IPython

私が知る限り、PyPi は PyPiXmlRpc で確認した情報を保存していません。

また、パッケージのダウンロード、抽出、および .egg-info の掘り下げを自動化しようとしましたが、一部のパッケージにはそのフォルダーがまったくありません。

どんな助けでも大歓迎であり、マナーの良いガジェットに使用されます:)

4

3 に答える 3

7

ここでパッケージと呼ぶものは、パッケージではなくディストリビューションであることに注意してください。ディストリビューションには、0 個以上のモジュールまたはパッケージを含めることができます。つまり、ディストリビューションからパッケージへの 1 対 1 のマッピングはありません。

実際にインストールして、新しく追加されたパッケージ、モジュール、および pth ファイルのファイルシステムの変更をイントロスペクトする以外に、ディストリビューションによってインストールされるモジュールとパッケージを検出する方法があるかどうかはわかりません。

于 2011-09-18T12:51:00.557 に答える
5

原則として、その情報を取得するために必要なものはすべて、setup.pyそのようなすべてのパッケージにあるはずの にあります。その情報は、ディストリビューション オブジェクトのパッケージ、py_modules、ext_package、および ext_modules を結合したものです。distutils.core.setup実際、この情報を取得するためだけに モックを作成した小さなスクリプトを次に示します。

import distutils.core
distutils.core._setup_stop_after = "config"
_real_setup = distutils.core.setup
def _fake_setup(*args, **kwargs):
    global dist
    dist = _real_setup(*args, **kwargs)

distutils.core.setup = _fake_setup

import sys
setup_file = sys.argv[1]
sys.argv[:] = sys.argv[1:]
import os.path
os.chdir(os.path.dirname(setup_file))

execfile(os.path.basename(setup_file))

cat = lambda *seq: sum((i for i in seq if i is not None), [])
pkgs = set(package.split('.')[0] for package
           in cat(dist.packages,
                  dist.py_modules,
                  [m.name for m in cat(dist.ext_modules)],
                  [m.name for m in cat(dist.ext_package)]))

print "\n".join(pkgs)

多くのパッケージでは、これは魅力のように機能しますが、反例については、 を参照numpyてください。

于 2011-08-25T02:55:41.033 に答える