Python pkgutil.walk_packages没有返回子包

时间:2013-06-10 13:05:50

标签: python packages

我有一个包布局:

scenarios/
    __init__.py
    X/
        __init__.py
        Y/
            __init__.py
    Z/
        __init__.py 

我已经执行了

import scenarios
pkgutil.walk_packages(scenarios.__path__, scenarios.__name__ + '.')

但这会生成一个仅包含X和Z包的列表,Y缺失。我可以用什么来获取所有子目录?

由于

2 个答案:

答案 0 :(得分:7)

这是一个理论:walk_packages函数尝试导入列出的每个模块。当它到达子包“Y”时,它会尝试导入它,但是有一个错误。默认情况下,此错误被禁止。副作用是walk_packages函数不会递归到Y.您可以使用“onerror”关键字参数来测试此理论。例如:

import sys, pkgutil
from traceback import print_tb

def onerror(name):
    print("Error importing module %s" % name)
    type, value, traceback = sys.exc_info()
    print_tb(traceback)

import scenarios
pkgutil.walk_packages(scenarios.__path__, scenarios.__name__ + '.', onerror=onerror)

答案 1 :(得分:0)

这至少在Python 3.6中有效。设置测试方案:

mkdir -p scenarios/X/Y scenarios/Z
find scenarios -type d -exec touch {}/__init__.py \;

现在运行示例代码的版本:

import pkgutil
import scenarios
for module_info in pkgutil.walk_packages(scenarios.__path__, scenarios.__name__ + '.'):
    print(module_info.name)

哪些印刷品:

scenarios.X
scenarios.X.Y
scenarios.Z