[英]Python referencing submodules from importing root package
假设我有一个目录结构,如:
root/
__init__.py
foo.py
dir1/
__init__.py
bar.py
dir2/
__init__.py
baz.py
其中各种 python 文件包含一些名为hello_world
函数。
我希望能够做的是写一些类似的东西:
import root
root.dir1.foo.hello_world()
root.dir1.dir2.baz.hello_world()
当然,当我这样做时,我得到一个AttributeError: module has no attribute
错误。 我认为,这是由于文档中的“__init__.py 陷阱”造成的。 如何操作 init 文件,以便可以运行上述代码?
__all__
参数,这对我的程序很重要。我试图通过将 __init__.py 文件更改为命名空间包来解决这个问题。 不幸的是,这似乎不起作用。 例如添加:
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
到各种 init 文件不会改变任何东西。 同样,直接设置__path__
属性也不能解决问题。 例如,在每个 init 文件设置中__path__ = ['<string name of child dir>']
不能解决错误。
这对我来说有点神秘,因为__path__
应该告诉 python 在哪里寻找子模块,而 init 文件应该按顺序运行,那么为什么它不能弄清楚东西在哪里呢?
此问题似乎在此处的文档中有所描述
一种解决方案是放置一个from . import *
在每个 init 文件中定义__all__
属性后from . import *
。 例如,在 dir1 中的 init 中放置:
__all__ = ['foo', 'dir2']
from . import *
这解决了用例,但似乎是错误的方式。 打开以获得更好的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.