天天看點

解決導包報錯:ModuleNotFoundError,ImportError

目錄

1. 問題表現

2. 嘗試去了解

3. 先說結論

4. 具體問題分析

5. 解決思路

6. 總結

翻譯過來大概的意思是:

找不到父包的情況下進行相對導入

沒有找到xxx子產品

既然找不到父包,那麼該如何才能找到它呢?

正如出現上述問題,我個人習慣性直接尋找解決方案,但其實是沒深入發掘過,下一次再次遇到了,可能還是知其然不知是以然。 打個比如:某天我正在用浏覽器興緻勃勃看着某站視訊時,畫面突然卡住不動,最先容易想到是不是我的網絡斷了對吧? 那麼這時候,稍微有點網絡知識,可能就會去ping一下看看網絡狀況,進而做下一步診斷。 同樣的,在出現上述報錯的問題時,使用一個正常方法,即通過sys.path輸出的清單,觀察Python的環境目錄,進而找出錯誤根源。

先說結論:

對于python的應用程式,隻需使用絕對路徑(不帶點哦,如 from .xxx import xxx)一切都會好起來的。

項目結構和具體程式

在pycharm中打開上述項目,當我們運作a.py時,一切都很正常,但當我使用command時,python3 a.py,會出現什麼問題呢?

出現: ModuleNotFoundError: No module named 'mypackge'

好了,回到最先開始提到的,嘗試使用sys.path去發現具體問題,把它放在代碼最前面:

注意觀察是不是發現什麼?pycharm和command解釋器分别輸出的内容中,pycharm列印的環境目錄清單多了一個項目app絕對路徑。

是的,無論你把sys.path放到項目中那個.py中去執行,都會看到有一個項目的絕對路徑。

直到現在,我猜你似乎已經發現 ModuleNotFoundError問題具體是什麼了。

做個測試

經過這麼一個小測試,發現使用pycharm解釋器輸出的實際結果有一條傳回True,那麼是不是可以說明from mypackge.base import Base成功搜尋到它的上級,也就是比對上了絕對路徑。而command輸出并沒有找到自己的上級而報錯。

順着上面得到的驗證,當使用command執行python3 a.py時,我們發現它沒有導入父子產品(也就是說沒有找到項目絕對路徑)。

這就好辦了,在不改動from mypackge.base import Base前提下,加入mypackge的上級目錄

也可以這樣寫:

是否在看某個庫的源代碼時,發現它們會使用from ..xxx import xxx 或 from .xxx import xxx導入子產品,當我們也這樣做的時,就出現導入報錯。

.module(帶點)是相對導入,相對僅在已先導入或已加載父子產品時才有效果,這就意味着你需要在目前運作環境中的某處已導入。當使用command執行python3 module.py,它不會事先導入父子產品,你需要自行導入,或者from youproject.moduleA import moduleA這樣的方式調用。

不管是怎麼寫,它們都應遵循着一個原則:對于python的應用程式,隻需使用絕對路徑,一切都會好起來