2017-09-05 133 views
3

因此,我在整个地方看到了很多有关__init__.py文件的答案,而且说实话,这对我来说都非常混乱,我并没有真正了解它,所以我希望得到一些帮助/基本解释。Python包中__init__.py层次结构的正确结构

我有一个包设置如下:

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

所以我这里有几个问题...

如何导入second_import.pyfirst_import.py

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

最后,如果我有这样的整个层次的外部的脚本,这样说:

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

我怎么会导入first_import.pytest_script.pysecond_import.py

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

因此,与这些问题的出路,我将提供什么我到目前为止已经试过一点背景知识:

(1)我初始化每个__init.py以其“水平”,比如这“顶部” __init__.py

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

(2)I加入__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'

我为任何和所有的想法,我一直在这个工作了几个小时,现在似乎无法破解它。非常感谢!

+0

使用绝对导入。 '从top_package.mid_package import first_import'和'from top_package.mid_package.bottom_package import second_import' – Sraw

+0

@Sraw在__init __。py'文件中还是在外部文件中? – user3684314

+0

@Sraw对外部文件做这样的操作不管用或不用'sys.path.append('../ top_package /')'(如果没有对当前'__init__进行编辑。 py'文件如上所述 – user3684314

回答

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 

你应该总是​​启动您的项目,那么你可以使用absolute import正常。

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

+0

呃不,总是使用'python -m ''或'setup.py'生成的脚本 – o11c