web-dev-qa-db-ja.com

pythonパッケージ?の一部であるすべてのモジュールをリストします

python package)の一部であるすべてのモジュールを見つける簡単な方法はありますか? この古い議論 を見つけましたが、実際には決定的ではありませんが、 os.listdir()に基づいて独自のソリューションを展開する前に、明確な回答が必要です。

91
static_rtti

はい、あなたはpkgutilまたは類似のものに基づいたものが欲しいです-この方法では、それらが卵やzipなどにあるかどうかに関係なくすべてのパッケージを同様に扱うことができます(os.listdirは役に立ちません)。

import pkgutil

# this is the package we are inspecting -- for example 'email' from stdlib
import email

package = email
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
    print "Found submodule %s (is a package: %s)" % (modname, ispkg)

それらもインポートする方法は?通常どおり__import__を使用できます。

import pkgutil

# this is the package we are inspecting -- for example 'email' from stdlib
import email

package = email
prefix = package.__+ "."
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix):
    print "Found submodule %s (is a package: %s)" % (modname, ispkg)
    module = __import__(modname, fromlist="dummy")
    print "Imported", module
133
u0b34a0f6ae

このジョブに適したツールはpkgutil.walk_packagesです。

システム上のすべてのモジュールをリストするには:

import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
    print(modname)

Walk_packagesはすべてのサブパッケージをインポートしますが、サブモジュールはインポートしないことに注意してください。

特定のパッケージのすべてのサブモジュールを一覧表示する場合は、次のようなものを使用できます。

import pkgutil
import scipy
package=scipy
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__,
                                                      prefix=package.__name__+'.',
                                                      onerror=lambda x: None):
    print(modname)

iter_modulesは、1レベルの深さのモジュールのみをリストします。 walk_packagesはすべてのサブモジュールを取得します。たとえば、scipyの場合、walk_packagesは次を返します。

scipy.stats.stats

iter_modulesが返すのは

scipy.stats

Pkgutilのドキュメント( http://docs.python.org/library/pkgutil.html )には、/ usr/lib/python2.6/pkgutil.pyで定義されている興味深い関数がすべてリストされていません。

おそらくこれは、機能が「パブリック」インターフェースの一部ではなく、変更される可能性があることを意味します。

ただし、少なくともPython 2.6(おそらく以前のバージョン?)の時点で)pkgutilには、利用可能なすべてのモジュールを再帰的にウォークするwalk_packagesメソッドが付属しています。

44
unutbu

これは私のために働く:

import types

for key, obj in nltk.__dict__.iteritems():
    if type(obj) is types.ModuleType: 
        print key
2
DarinP