Python踩坑記錄--避免對包管理時出現錯誤

文章記錄了構成包的條件,導包中出現的一些錯誤,最後總結自定義包管理的“思維導圖”。
閱讀時間5分鐘。

構成包的兩個條件

  • 文件夾下面包含__init__.py文件
  • 文件夾不作爲頂層模塊,即文件夾下直接子代碼文件不能作爲程序入口

兩種導包方法

  • 直接用包名進行導入
  • 使用相對導入方法,即使用符號’.‘指明當前包,’…'指明上一層包

常見錯誤

no module ****

sys.path是一個預定義的列表,python解釋器會在sys.path中給定的路徑下找包,像系統包等等之所以能夠導入就是因爲路徑在sys.path中。出現這個問題的直接原因就是sys.path列表裏面沒有對應文件所在的路徑,出現的間接原因可能是(直接使用包名導入):

  • 兩個完全獨立的(即不屬於同一個頂層包(有嵌套關係的最頂層包))的包相互調用;
  • 兩個沒有嵌套關係,但同屬於一個頂層包的包相互調用;

解決辦法:

  • 將絕對路徑添加導sys.path列表裏面
  • 從最頂層包開始導入
ValueError: attempted relative import beyond top-level package 或者 attempted relative import no package

這個問題是相對路徑導入錯誤,可能的原因是:

  • 使用相對路徑導入方法,兩個完全獨立的(即不屬於同一個頂層包(有嵌套關係的最頂層包))的包相互調用;
  • 對於兩個沒有嵌套關係,但同屬於一個頂層包的包相互調用,在包內因爲作爲了程序入口,不能作爲包,所以導致了第一個可能原因的發生;

自已包管理“思維導圖”

這裏作爲一名研究者來說的話,下面的思路應該夠了。

首先在項目根目錄下,創建一個main.py作爲入口函數,其餘的包全放在lib包下面,這樣main能夠訪問lib包,且lib包內的所有嵌套包均能相互訪問。
換句話說,你只需要將入口函數獨立出來,其餘的功能函數或類對象作爲接口全放在lib下,保證了接口之間的相互調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章