列出所有属于Python包的模块?
列出所有属于Python包的模块?
有没有一种简单的方法来找到所有属于Python包的模块?我找到了这个旧的讨论,它并不完全,但我想在我基于os.listdir()的方案推出之前得到确定的答案。
admin 更改状态以发布 2023年5月25日
这项工作的正确工具是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仅列出一级模块。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方法。
是的,你想要基于pkgutil
或类似的方式--这样你就可以像处理鸡蛋或压缩包一样处理所有的包(在这种情况下,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.__name__ + "." 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