ImportError :cannot import name xxxxxx 的三種類型的解決方法

網上關於這種問題的解決方案一大堆,但是絕大多數都是不適用,或者說解決不了問題,我根據別人所遇到的和我自己遇到的,對這個問題整理了一下,希望能解決這個問題。

一、缺少這個module或者func或者package

  1. 缺少python的各種package的話,就自己pip一下
  2. 根據路徑去找,發現是否忘記導入了

二、命名問題

  1. 這個問題也是很難容易解決,找一下路徑,對應一下兩個name,改一下就行。
  2. 還有可能出現這種情況的是你使用的是別的官方的代碼,版本升級,導致這個函數不用了,改成了另一個函數了,這個時候就要百度一下(一般行不通),或者去github搜一搜這個問題,比如我用mmdetection,那我就去這個官方倉庫下搜一搜有沒有別人也出現這個問題,是不是版本的問題。比如我使用pytorch,那就搜一下pytorch的文檔,看有沒有這個方法的修改說明。

三、路徑問題(重點)

路徑問題一般可能出現這兩種:一是路徑有問題,路徑不完整或者錯誤導致的;二是路徑沒問題,是路徑之間的訪問順序問題導致的。

  1. 路徑有問題的:
    前面加上一個from xxx(你的包名) import XXX(你要導入的文件),然後最好根據這個路徑去找找你所要導入的文件是否存在,一般都能解決這個問題。
  2. 路徑沒問題的:

一個現象:路徑沒問題的,一般就是你的各個文件夾之間的導包出現了死鎖現象,如果是出現下面這個問題:
在這裏插入圖片描述
解決方法:只在兩個文件之間的死鎖,建議是把要導入的函數或者模塊寫進第三個文件中,兩個文件的死鎖現象是解決不了的,捋清一下誰依賴誰,誰又依賴誰,然後分開寫,如果不明白的話,看下面我自己遇到的問題,和我對其錯誤信息的分析,然後自己把他們分開來寫。

另一個現象:如果是出現在多個文件夾之間的引用,然後你在錯誤信息指定的文件夾中也找到了這個module,但是就是import不到的現象:
下面是我在mmdetection上跑實驗的時候報錯的截圖:
在這裏插入圖片描述
分析:我在mmdet.core文件夾下的一個文件中是有eval_recalls的函數的,也就是路徑沒問題,命名也沒問題,那就是import的循序出現了問題,造成了import追尾現象(死鎖),具體分析如下。
如上圖所示,我在mmdet.core中import eval_recalls,但是導不進去,於是我看前面的錯誤信息中,也訪問了mmdet.core, init.py文件,然後直接跳到文件夾evalution的init下了(eval_recalls函數在core/evalution下的recall.py文件下)
在這裏插入圖片描述
在這裏插入圖片描述
init文件夾的作用是將該文件下所有的包引入,所以訪問完init,就會挨個將各個文件夾的文件導入內存中,
看上圖,在evaluation文件夾先訪問了_init_.py,也就是將文件下所有文件導入內存,錯誤信息中,evaluation/init.py中又去訪問了eval_hooks.py文件
在這裏插入圖片描述
我們看一下evaluation下的_init_.py文件:
在這裏插入圖片描述
所以,在程序執行到第三行的時候,跳到了eval_hooks裏面了,並沒有將recall文件中的module導入到內存。
然後運行到coco.py的時候,這時執行:from mmdet.core import eval_recalls的時候
在這裏插入圖片描述
又去core的文件中導入,這時又要init吧。init後又要evaluation的init吧,然後到了evaluation/_init_.py的時候,開始導包了吧,然後到第三行是不是又要導eval_hooks的包了????這時候不就出現了死鎖現象???死循環了,所以程序在這一步就import不到name ‘eval_recalls’ 這個module了。
在這裏插入圖片描述
解決方法:

  1. 全路徑,在導入eval_recalls的時候,from的時候,把路徑寫全,具體導eval_revalls的文件,則這樣就無須經過多層的import,導致出現死循環的問題。改寫成from mmdet.core.evaluation.recall import eval_recalls
  2. 找到死循環的問題所在,換import的順序,比如下圖:更換兩行的import順序,這個問題不能保證沒有接下去的問題,因爲換了後,可能又會導致其他死循環存在,不過,實在沒辦法也得試試呀
    在這裏插入圖片描述

ps:大家可能每次遇到這個問題,都會跟我一樣,都會先網上一搜,然後發現沒有一個可以解決的方案,然後又懶得看大篇的錯誤信息,然後就卡住了。其實每次錯誤的時候,多看看錯誤信息,自己跟着捋一捋,還是可以找到解決方案滴!

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