正确的Python包中__init__.py层次结构

时间:2017-09-05 04:30:46

标签: python python-3.x import init python-module

所以我在__init__.py文件的所有地方都看到了不少答案,说实话,这对我来说非常混乱,我并不是真的得到它,所以我希望得到一些帮助/基本解释。

我的包装设置如下:

top_package/
├── __init__.py
└── mid_package/
    ├── __init__.py
    ├── first_import.py
    └── bottom_package/
         ├── __init__.py
         └── second_import.py

所以我在这里有一些问题......

如何在first_import.py中导入second_import.py

接下来,如何在second_import.py中导入first_import.py

最后,如果我在整个层次结构之外有一个脚本,请这样说:

docs/
├── scripts
|   └── test_script.py
└── top_package/

如何在first_import.py中导入second_import.pytest_script.py

我的Python版本是3.4.5(64位Anaconda),而且我在Windows上运行,如果这有所不同。

因此,在这些问题出来之后,我将提供一些关于我迄今为止所尝试的内容的背景信息:

(1)我使用"等级"初始化每个__init.py,例如" top" __init__.py

import sys
sys.path.append("C:\Path\To\top_package")

(2)我添加了一行__all__以及该级别所有内容的数组,例如:

__all__ = ['mid_package']

(3)然后我添加了相关的导入,例如:

from .mid_package import first_import

或者:

from .. import first_import

(4)然后我会尝试在second_import.py中的这些文件中正常加载这些文件:

import first_import

(5)接下来,在test_script.py中,我会尝试加载为:

import sys
sys.path.append('../top_package/')
import first_import

哪会导致ImportError: No module named 'first_import'

我正在考虑任何和所有的想法,我现在已经在这个问题上工作了几个小时,似乎无法破解它。非常感谢!

1 个答案:

答案 0 :(得分:0)

嗯,这是一个关于python项目结构的老问题。但我认为关键问题是您当前的工作目录不是top_package。因此,当您的口译员想要搜索top_package时,它就超出了范围。

这不是一个好习惯,您应该始终使用位于根目录中的脚本启动项目。一个构造良好的python项目应该像下面的例子:

project
----src
--------app.py
--------modules
------------__init__.py
------------module.py
----test
--------test_cases.py
----doc
--------document.md
----.gitignore
----license.txt
----readme.md

您应该始终按python src/app.py启动项目,然后才能正确使用absolute import

请注意,这只是一个非常基本的例子。