Python导入子模块前缀

时间:2017-02-04 22:25:02

标签: python python-3.5 python-import

目前我对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

在核心/ 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'

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

核心/数据/ init .py文件:

from core.data.data import Data as Data

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

为什么我必须为这些名字添加前缀?由于

中存在 init .py

核心/数据

目录,我认为:

核心/数据/ data.py

可见且可导入。在实践中它不是。

我做错了什么?我感到非常谦卑,不得不问这些,我很抱歉这是基本的,但我提前感谢任何帮助。我一直在阅读有关导入的PEP文档,而不是单击。

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

from .data import Data

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