获取Python包的所有函数
获取Python包的所有函数
我有一个多模块的Python包,其中有一个文件包含类MyClass
,还有几个文件包含函数(一个文件可以包含多个函数)。\n我尝试获取这个包中的所有函数。\n首先,使用以下代码:\n
modules = [] for importer, module, ispkg in pkgutil.iter_modules(package.__path__): modules.extend(module)
\n但是我只得到了模块的名称,而不是模块对象。\n当我尝试使用inspect.getmembers(module, inspect.isfunction)
获取这些模块的函数时,当然得到了一个空集合。\n那么,我如何才能从包中获取所有模块对象以进一步获取函数呢?\n是否存在更简单的方法来获取多文件包中的所有函数?\nP.S. 我需要的是确切的function
对象,而不仅仅是它们的名称。\n编辑。\n
- \n
dir(package)
只给出了内置变量的列表:\n[\'__builtins__\', \'__doc__\', \'__file__\', \'__name__\', \'__package__\', \'__path__\']
inspect.getmembers(package, inspect.isfunction)
也给出了一个空列表,以及我上面描述的每个module
的相同代码。dir(module)
给出了可用于str
对象的所有方法的名称列表(因为iter_modules()
只给出了模块的名称)。- AST...你确定没有更简单的解决方案吗?
\n
\n
\n
\n
问题的原因是在尝试获取Python包的所有函数时,由于无法导入子模块而导致出错。解决方法是在获取子模块之前先加载父模块。
具体的解决方法是使用下面的代码:
for importer, module, ispkg in pkgutil.iter_modules(package.__path__): __import__(package.__name__ + '.' + module) module_obj = sys.modules[package.__name__ + '.' + module] functions = [func for func in dir(module_obj) if callable(getattr(module_obj, func))] print(functions)
这段代码会遍历指定包的所有子模块,然后通过动态导入的方式加载子模块,并获取子模块的对象。之后,通过遍历模块对象的属性,筛选出可调用的函数,并将它们打印出来。
通过这种方式,我们可以获取到Python包中所有子模块的函数列表。