繁体   English   中英

Python从导入根包中引用子模块

[英]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 文件,以便可以运行上述代码?

注意事项

  • 我想避免删除 init 文件,因为它们包含__all__参数,这对我的程序很重要。
  • 我还想避免在主程序中编写多个导入语句,因此此处指定的解决方案将不起作用。
  • 我正在使用 Python 3.6

我试过的:

我试图通过将 __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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM