Python 导入子模块前缀

Python Import Submodule Prefix

我现在对 python 进口感到有点沮丧。我想老实说我只是记错了并且错误地执行了导入。

我的应用程序具有以下目录结构:

open_app
|-  __init__.py
|-  open_app.py
|-  core/
|  |- __init__.py
|  |- data/
|  |  |- __init__.py
|  |  |- data.py
|  |- settings/
|  |- interface/
|-  extensions/

init.py 中我有以下内容:

import open_app.Open_App as Open_App
if __name__ == "__main__":
    main = Open_App()
    input("Press a key to continue")

在 open_app.py 我有以下内容:

from core import data as Data
class Open_App():
    pass

在core/init.py里面,我什么都没有

在core/data/init.py 我有以下内容:

from data import Data as Data

在 core/data/data.py 我有以下内容:

class Data():
    pass

问题是当我 运行 模块使用 IDLE 时,我收到以下错误消息:

Traceback (most recent call last):
  File "F:\Personal\Code\Python\open_app\__init__.py", line 1, in <module>
    import open_app.Open_App as Open_App
  File "F:\Personal\Code\Python\open_app\open_app.py", line 1, in <module>
    from core import data as Data
  File "F:\Personal\Code\Python\open_app\core\data\__init__.py", line 1, in <module>
    from data import Data as Data
ImportError: No module named 'data'

我只是想让导入工作。所以我决定改变

core/data/init.py文件到:

from core.data.data import Data as Data

哪个有效。但对我来说,这似乎不是一个很好的解决方案。必须在所有子模块前面加上每个模块目录的前缀对我来说没有意义。随着项目变大,执行单元测试将变得非常困难。

为什么我必须在名字前加上这样的前缀?由于 init.py 存在于

core/data

目录,我认为应该是:

core/data/data.py

将是可见的和可导入的。实际上不是。

我做错了什么?不得不问这些问题我感到非常谦虚,很抱歉这是基本问题,但我很感激提前提供的任何帮助。我一直在阅读有关导入的 PEP 文档,但有些东西没有点击。

提前致谢!

如果您要在不指定完整路径的情况下将 data 导入 __init__.py,您可能需要相对导入:

from .data import Data

请注意,您使用的别名 Data 完全没有必要,因为导入的对象具有相同的名称。