如何在Python中查找所有子模块?
-
06-09-2019 - |
题
虽然在 Python 中将“子”模块导入另一个模块并列出其属性相当简单,但当您想要导入时,它会变得稍微困难一些 全部 子模块。
我正在为现有 3D 应用程序构建一个工具库。每个工具都有自己的菜单项和子菜单。我希望该工具负责创建自己的菜单,因为其中许多菜单会根据上下文和模板进行更改。我希望我的基本模块能够找到所有子模块并检查 create_menu()
函数并在找到它时调用它。
发现所有子模块的最简单方法是什么?
其他提示
我认为做这种插件的最好方法是使用 entry_points
和 用于查询它们的 API.
当我还是个善良的人,刚刚开始使用 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]
这不是安全或“正确”的方式,但也许它对我们有用。它是 非常 旧代码,所以请不要打败我。
只要将每个插件实现为基于文件系统的模块,上面遍历文件系统来查找子模块的解决方案就可以。
更灵活的方法是在主模块中显式插件列表,并让每个插件(无论是由文件、动态创建的模块,还是类的实例创建的模块)显式地将其自身添加到该列表中。也许通过 registerPlugin 函数。
记住:“显式优于隐式”是 Python 禅宗的一部分。
你可以试试 glob
必应目录:
import os
import glob
modules = glob.glob(os.path.join('/some/path/to/modules', '*.py'))
然后你可以尝试导入它们:
checked_modules
for module in modules:
try:
__import__(module, globals(), locals()) # returns module object
except ImportError:
pass
else:
checked_modules.append(module)
不隶属于 StackOverflow