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

15 浏览
0 Comments

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

有没有一种简单的方法来找到所有属于Python包的模块?我找到了这个旧的讨论,它并不完全,但我想在我基于os.listdir()的方案推出之前得到确定的答案。

admin 更改状态以发布 2023年5月25日
0
0 Comments

这项工作的正确工具是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方法。

0
0 Comments

是的,你想要基于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

0