有没有一种简单的方法可以找到python包中的所有模块?我已经找到了this old discussion,这并不是很确定,但我希望在推出自己的基于os.listdir()的解决方案之前有一个明确的答案。
发布于 2009-11-10 20:58:55
是的,您想要基于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
发布于 2009-11-10 23:15:48
适合这项工作的工具是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中定义的所有有趣的函数。
也许这意味着这些函数不是“公共”接口的一部分,可能会发生变化。
然而,至少在Python2.6(也许是更早的版本?)pkgutil附带了一个walk_packages方法,它递归地遍历所有可用的模块。
发布于 2013-03-31 04:24:31
这对我来说很有效:
import types
for key, obj in nltk.__dict__.iteritems():
if type(obj) is types.ModuleType:
print key
https://stackoverflow.com/questions/1707709
复制相似问题