列出属于python包的所有模块?

sta*_*tti 96 python module packages introspection python-import

有没有一种直接的方法来查找属于python包的所有模块?我发现这个旧的讨论并不是真正的结论,但在推出基于os.listdir()的自己的解决方案之前,我希望得到明确的答案.

u0b*_*6ae 136

是的,你想要一些基于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)
Run Code Online (Sandbox Code Playgroud)

如何进口呢?您可以__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
Run Code Online (Sandbox Code Playgroud)

  • 我能够像这样使用导入器:`m = importer.find_module(modname).load_module(modname)`然后`m`是模块,例如:`m.myfunc()` (28认同)
  • 什么是`pkgutil.iter_modules`返回的`importer`?我可以用它来导入一个模块而不是使用这个看似"hackish"的`__import __(modname,fromlist ="dummy")`? (9认同)

unu*_*tbu 45

这项工作的正确工具是pkgutil.walk_packages.

要列出系统上的所有模块:

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

请注意,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)
Run Code Online (Sandbox Code Playgroud)

iter_modules只列出一级深度的模块.walk_packages获取所有子模块.例如,在scipy的情况下,walk_packages返回

scipy.stats.stats
Run Code Online (Sandbox Code Playgroud)

而iter_modules只返回

scipy.stats
Run Code Online (Sandbox Code Playgroud)

有关pkgutil(http://docs.python.org/library/pkgutil.html)的文档没有列出/usr/lib/python2.6/pkgutil.py中定义的所有有趣函数.

也许这意味着这些功能不属于"公共"界面,可能会发生变化.

但是,至少从Python 2.6(可能还有早期版本?)开始,pkgutil附带了一个walk_packages方法,该方法以递归方式遍历所有可用模块.

  • `walk_packages`现在在文档中:http://docs.python.org/library/pkgutil.html#pkgutil.walk_packages (5认同)