Python:查找包中的所有包

9
给定一个包,如何自动查找其所有子包?
2个回答

10

你不能依赖于已加载模块的自省,因为子包可能尚未被加载。假设所需的顶级包不是蛋(egg)、压缩文件、扩展模块或从内存中加载,则必须查看文件系统。

def get_subpackages(module):
    dir = os.path.dirname(module.__file__)
    def is_package(d):
        d = os.path.join(dir, d)
        return os.path.isdir(d) and glob.glob(os.path.join(d, '__init__.py*'))

    return filter(is_package, os.listdir(dir))

不起作用。那个 glob.glob 的东西返回一个列表:这是一个错误吗? - Ram Rachum
我忘记了os.listdir不会返回完整路径。已修复该错误。(在布尔上下文中的空列表将被评估为false。) - James Emerton
SilentGhost 告诉我,尽管我的实现对我来说有效,但很糟糕。我假设您的实现没问题,所以我选择它作为答案。不过,您认为在py后加问号是可以的吗?如果没有pycpyo文件,那么它不会工作,不是吗? - Ram Rachum
2
你说得对,应该使用星号以匹配.py、.pyc和.pyo文件。目前来看,这种方法仍然存在很多陷阱。我希望你不会将其用于任何重要的事情,比如导弹控制。=) - James Emerton

0
受James Emerton答案的启发:
def find_subpackages(module):
    result=[]
    for thing in os.listdir(os.path.dirname(module.__file__)):
        full=os.path.join(os.path.dirname(module.__file__),thing)
        if os.path.isdir(full):
            if glob.glob(os.path.join(full, '__init__.py*'))!=[]:
                result.append(thing)
    return result

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接