python package)の一部であるすべてのモジュールを見つける簡単な方法はありますか? この古い議論 を見つけましたが、実際には決定的ではありませんが、 os.listdir()に基づいて独自のソリューションを展開する前に、明確な回答が必要です。
はい、あなたは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
このジョブに適したツールは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メソッドが付属しています。
これは私のために働く:
import types
for key, obj in nltk.__dict__.iteritems():
if type(obj) is types.ModuleType:
print key