【问题标题】:Python: Finding all packages inside a packagePython:查找包内的所有包
【发布时间】:2010-10-24 08:07:08
【问题描述】:

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

【问题讨论】:

    标签: python import packages


    【解决方案1】:

    您不能依赖已加载模块的自省,因为可能尚未加载子包。您必须查看文件系统,假设有问题的顶级包不是鸡蛋、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))
    

    【讨论】:

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

    灵感来自 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
    

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      相关资源
      最近更新 更多