如何在Python中找到所有子模块?

13 投票
6 回答
7034 浏览
提问于 2025-04-15 11:50

在Python中,把一个“子”模块导入到另一个模块里并列出它的属性其实很简单,但如果你想一次性导入所有的子模块,就会稍微复杂一些。

我正在为一个已有的3D应用程序构建一个工具库。每个工具都有自己的菜单项和子菜单。我希望每个工具能自己负责创建菜单,因为很多工具的菜单会根据不同的情况和模板而变化。我希望我的基础模块能够找到所有的子模块,并检查是否有一个叫create_menu()的函数,如果找到了就调用它。

那么,发现所有子模块的最简单方法是什么呢?

6 个回答

1

当我还是个刚开始学习Python编程的小白时,我为我的模块化IRC机器人写了这个代码:


    # Load plugins

    _plugins = []

    def ifName(name):
        try:
            return re.match('([^_.].+)\.[^.]+', a).group(1)
        except:
            return None

    def isValidPlugin(obj):
        from common.base import PluginBase
        try:
            if obj.__base__ == PluginBase:
                return True
            else:
                return False
        except:
            return False

    plugin_names = set(ifilter(lambda a: a!=None, [ifName(a) for a in os.listdir(os.path.join(os.getcwd(), 'plugins'))]))
    for plugin_name in plugin_names:
        try:
            plugin = __import__('plugins.'+plugin_name, fromlist=['plugins'])
            valid_plugins = filter(lambda a: isValidPlugin(a), [plugin.__getattribute__(a) for a in dir(plugin)])
            _plugins.extend(valid_plugins)
        except Exception, e:
            logger.exception('Error loading plugin %s', plugin_name)

    # Run plugins

    _plugins = [klass() for klass in _plugins]

这个代码并不安全,也不是“正确”的做法,但也许它还是会对你有帮助。请注意,这段代码非常老旧,所以别太苛责我。

3

我觉得做这种插件的最好方法是使用 entry_points查询它们的API

-2

使用 dir() 函数和 imp 模块

撰写回答