8

我有一个包布局:

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

我已经执行了

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

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

谢谢

4

2 回答 2

9

这是一个理论: 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)
于 2013-12-10T03:03:00.060 回答
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
于 2020-09-11T16:43:44.843 回答