【发布时间】:2019-06-28 01:29:16
【问题描述】:
问题:
假设我的目录结构如下:
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 错误。我认为这是由于docs 中的“__init__.py 陷阱”。如何操作 init 文件以使上述代码运行?
注意事项
- 我想避免删除初始化文件,因为它们包含
__all__参数,这对我的程序很重要。 - 我还想避免在主程序中编写多个导入语句,因此指定here 的解决方案将不起作用。
- 我使用的是 Python 3.6
我的尝试:
我试图通过将 __init__.py 文件更改为 namespace packages 来解决这个问题。不幸的是,这似乎不起作用。例如。添加:
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
对各种初始化文件没有任何改变。同样,直接设置__path__属性也不能解决问题。例如。在每个初始化文件设置中__path__ = ['<string name of child dir>'] 都不能解决错误。
这对我来说有点神秘,因为 __path__ 应该告诉 python 在哪里寻找子模块,而 init 文件应该是按顺序运行的,为什么它不能弄清楚事情在哪里?
注意事项:
文档here中似乎描述了这个问题
【问题讨论】:
标签: python python-3.x python-import