有没有一种标准的方法列出包中Python模块的名称?

2024-06-23 03:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种简单的方法列出包中所有模块的名称,而不使用__all__

例如,给定此包:

/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py

我想知道是否有一种标准或内置的方法来做这样的事情:

>>> package_contents("testpkg")
['modulea', 'moduleb']

手动方法是遍历模块搜索路径以找到包的目录。然后可以列出该目录中的所有文件,筛选出唯一命名的py/pyc/pyo文件,去掉扩展名,并返回该列表。但对于模块导入机制已经在内部做的事情来说,这似乎是相当多的工作。这项功能在任何地方都公开了吗?


Tags: 模块文件方法py目录名称package标准
3条回答
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)])

使用python2.3 and above,还可以使用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])]

相关问题 更多 >

    热门问题