Python:查找包中的所有包

Python:查找包中的所有包,python,import,packages,Python,Import,Packages,给定一个包,如何自动找到它的所有子包?您不能依赖于对已加载模块的内省,因为子包可能尚未加载。您必须查看文件系统,假设所讨论的顶级包不是egg、zip文件、扩展模块或从内存加载的 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) a

给定一个包,如何自动找到它的所有子包?

您不能依赖于对已加载模块的内省,因为子包可能尚未加载。您必须查看文件系统,假设所讨论的顶级包不是egg、zip文件、扩展模块或从内存加载的

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))

受詹姆斯·埃默顿回答的启发:

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

不工作。glob.glob返回一个列表:这是一个错误吗?我忘记了os.listdir不返回完整路径。修正了这个错误。(布尔上下文中的空列表的计算结果为false。)SilentGhost告诉我,我的实现很糟糕,尽管它对我有效。我假设你的没问题,所以我想我会选择这个作为答案。但是,您认为可以在
py
后面加上问号吗?如果没有
pyc
pyo
文件,它难道不起作用吗?没错,它应该是一个星号,以便与.py、.pyc和.pyo文件匹配。就目前而言,这类事情仍然存在很多问题。我希望你不要把它用于任何重要的事情,比如导弹控制