[英]Importing Python modules from different levels of hierarchy
在我的git信息庫的頂層中,我具有以下文件結構:
miscellaneous Dockerfiles, readme, etc
Code/
training.py
data/
generate.py
tasksets.py
有時候我想導入generate
從內部模塊tasksets
模塊,當我運行tasksets
模塊作為腳本,所以tasksets
包括以下導入:
import generate
其他時候,我想從training
模塊中導入tasksets
模塊,因此training
包含以下導入:
import tasksets
但是,此設置給我帶來了問題。 tasksets
可以導入generate
很好,當我運行tasksets
作為一個劇本,但拋出一個錯誤,如果我輸入tasksets
內training
,當我跑training
作為一個腳本(我想是因為training
不能找到generate
的默認路徑中的腳本)。 我嘗試使用__init__.py
文件,相對導入等查看各種其他StackOverflow問題和答案。目前,我的解決方法是在tasksets
使用以下幾行:
if __name__ == "__main__": import generate
else: from data import generate
但這感覺不對(我的IDE也都不喜歡)。 請有人可以解釋如何使用正確的__init__.py
文件和import語句組合, tasksets
在以腳本方式運行tasksets
時可以導入generate
,以腳本方式運行training
時也可以導入tasksets
?
您最好使用經典的Python模塊/包體系結構。
projectname/
__init__.py
__main__.py
data/
__init__.py
generate.py
tasksets.py
要使用您的應用,請進入projectname/../
目錄(上一級projectname/
)並運行python -m projectname
。 這將執行projectname/__main__.py
。
在__main__.py
您將編寫如下內容:
from projectname.data import generate
from projectname.data import tasksets
if __name__ == '__main__':
generate.foo()
tasksets.bar()
projectname.
) if __name__ == '__main__'
導入子if __name__ == '__main__'
__main__.py
將是您的應用程序/腳本的唯一入口點。 在任何其他文件中,您將使用相同的語法和路徑來導入其他模塊:
data/generate.py
:
from projectname.data import tasksets
def foo():
print('SPAM!')
tasksets.bar()
我不太喜歡的東西,但是我不確定PEP是否會拒絕,
在您的項目名稱projectname/__init__.py
文件中,您可以編寫:
from projectname.data import generate
from projectname.data import tasksets
因此,您的兩個子模塊將被導入到主作用域__init__.py
,因此您可以從該作用域中導入子模塊,例如
data/generate.py
:
from projectname import generate
但是,我真的不是很喜歡這種方式(因為Explicit比隱式要好。 )
最后但並非最不重要的,
python projectname/__main__.py
命令,但我仍然建議使用python -m projectname
setup.py
文件,以在系統上“安裝”您的應用程序,只需運行projectname
命令即可運行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.