是否有直接的方法列出包中所有模块的名称,而不使用__all__
?
例如,给定此包:
/testpkg /testpkg/__init__.py /testpkg/modulea.py /testpkg/moduleb.py
我想知道是否有标准或内置方式来做这样的事情:
>>> package_contents("testpkg") ['modulea', 'moduleb']
手动方法是遍历模块搜索路径以查找包的目录.然后可以列出该目录中的所有文件,过滤掉唯一命名的py/pyc/pyo文件,剥离扩展名,然后返回该列表.但对于模块导入机制已在内部进行的操作,这似乎是相当多的工作.该功能是否暴露在任何地方
使用python2.3及更高版本,您还可以使用该pkgutil
模块:
>>> import pkgutil >>> [name for _, name, _ in pkgutil.iter_modules(['testpkg'])] ['modulea', 'moduleb']
编辑:请注意,该参数不是模块列表,而是路径列表,因此您可能希望执行以下操作:
>>> import os.path, pkgutil >>> import testpkg >>> pkgpath = os.path.dirname(testpkg.__file__) >>> print [name for _, name, _ in pkgutil.iter_modules([pkgpath])]
import module help(module)
也许这会做你想要的?
import imp import os MODULE_EXTENSIONS = ('.py', '.pyc', '.pyo') def package_contents(package_name): file, pathname, description = imp.find_module(package_name) if file: raise ImportError('Not a package: %r', package_name) # Use a set because some may be both source and compiled. return set([os.path.splitext(module)[0] for module in os.listdir(pathname) if module.endswith(MODULE_EXTENSIONS)])
不知道我是否忽略了什么,或者答案是否已过时但是;
如user815423426所述,这仅适用于活动对象,并且列出的模块仅是之前导入的模块.
使用inspect查看包中的模块似乎非常简单:
>>> import inspect, testpkg >>> inspect.getmembers(testpkg, inspect.ismodule) ['modulea', 'moduleb']