gpt4 book ai didi

python - python3 中的 pkgutil.walk_packages 需要 __init__.py 吗?

转载 作者:太空狗 更新时间:2023-10-30 01:20:12 24 4
gpt4 key购买 nike

PEP420 使 __init__.py 文件可选:https://docs.python.org/3/whatsnew/3.3.html#pep-420-implicit-namespace-packages

尽管看起来没有它们,pkgutil.walk_packages 无法按预期运行:https://docs.python.org/3/library/pkgutil.html#pkgutil.walk_packages

考虑以下示例:

$ tree foo
foo
├── bar
│   ├── baz.py
│   └── __init__.py
├── __init__.py
└── womp.py

和一个测试脚本

# test.py
import pkgutil

import foo


for _, mod, _ in pkgutil.walk_packages(foo.__path__, foo.__name__ + '.'):
print(mod)

在 python2 和 python3 中我得到以下输出:

$ python2.7 test.py
foo.bar
foo.bar.baz
foo.womp
$ python3.5 test.py
foo.bar
foo.bar.baz
foo.womp

删除 __init__.py 文件并仅使用 python3,我明白了:

$ find -name '__init__.*' -delete
$ python3.5 test.py
foo.bar

模块绝对是可导入的:

$ python3.5 -c 'import foo.bar.baz'
$

这是一个错误吗?我是否被迫创建 __init__.py 文件来实现我想要的?

最佳答案

作为解决方法(也许这会对其他人有所帮助),我正在使用类似的方法。它并不完美(如果 pwd 发生变化或包未以 . 为根则损坏。)但它确实做了我想为我的简单用例做的事情:

def walk_modules(pkg):
assert hasattr(pkg, '__path__'), 'This function is for packages'
path = pkg.__name__.replace('.', '/')
modules = []
for root, _, filenames in os.walk(path):
for filename in filenames:
if filename.startswith('.') or not filename.endswith('.py'):
continue
path = os.path.join(root, filename)
modules.append(os.path.splitext(path)[0].replace('/', '.'))
for module in sorted(modules):
yield __import__(module, fromlist=['__trash'])

关于python - python3 中的 pkgutil.walk_packages 需要 __init__.py 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com