目錄
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的應用程式,隻需使用絕對路徑,一切都會好起來