【问题标题】:Python referencing submodules from importing root packagePython 从导入根包中引用子模块
【发布时间】: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


    【解决方案1】:

    一种解决方案是在每个初始化文件中定义__all__ 属性后放置from . import *。例如。在 dir1 的 init 中放入:

    __all__ = ['foo', 'dir2']
    from . import *
    

    这解决了用例,但似乎是错误的方式。打开以获得更好的答案。

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2023-01-09
      • 2016-07-30
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2019-07-31
      相关资源
      最近更新 更多