簡體   English   中英

從不同層次的層次導入Python模塊

[英]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作為一個劇本,但拋出一個錯誤,如果我輸入tasksetstraining ,當我跑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()
  1. 您將使用絕對導入路徑(由模塊名和一個點,從projectname.
  2. 您將從if __name__ == '__main__'導入子if __name__ == '__main__'
  3. __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
  • 您可以使用setuptools創建setup.py文件,以在系統上“安裝”您的應用程序,只需運行projectname命令即可運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM