2017-09-05 130 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