我有一个包布局:
scenarios/
__init__.py
X/
__init__.py
Y/
__init__.py
Z/
__init__.py
我已经执行了
import scenarios
pkgutil.walk_packages(scenarios.__path__, scenarios.__name__ + '.')
但这会生成一个仅包含X和Z包的列表,Y缺失。我可以用什么来获取所有子目录?
由于
答案 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