ImportError:沒法導入名稱X

我有四個不一樣的文件,分別命名爲:main,vector,entity和physics。 我不會發布全部代碼,而只會發佈導入代碼,由於我認爲這就是錯誤所在。 (若是須要,我能夠發佈更多信息) python

主要: 函數

import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement

實體: this

from vector import Vect
from physics import Physics
class Ent:
    #holds vector information and id
def tick(self, dt):
    #this is where physics changes the velocity and position vectors

向量: 編碼

from math import *
class Vect:
    #holds i, j, k, and does vector math

物理: spa

from entity import Ent
class Physics:
    #physics class gets an entity and does physics calculations on it.

而後,我從main.py運行,出現如下錯誤: rest

Traceback (most recent call last): File "main.py", line 2, in <module> from entity import Ent File ".../entity.py", line 5, in <module> from physics import Physics File ".../physics.py", line 2, in <module> from entity import Ent ImportError: cannot import name Ent

我對Python很是陌生,可是已經使用C ++了很長時間。 我猜想該錯誤是因爲兩次導入實體引發的,一次是在實體中,一次是在物理學中,可是我不知道解決方法。 有人能夠幫忙嗎? code


#1樓

雖然您絕對應該避免循環依賴,但能夠推遲python中的導入。 orm

例如: ci

import SomeModule

def someFunction(arg):
    from some.dependency import DependentClass

這(至少在某些狀況下)將避免該錯誤。 get


#2樓

這是循環依賴性。 無需對代碼進行任何結構修改便可解決。 出現問題是由於在vector您要求當即使entity可用,反之亦然。 出現此問題的緣由是,您要求在模塊準備就緒以前訪問它的內容-經過使用from x import y 。 這基本上與

import x
y = x.y
del x

Python可以檢測循環依賴關係並防止導入的無限循環。 本質上,全部發生的事情都是爲模塊建立了一個空的佔位符(即,它沒有內容)。 一旦循環依賴的模塊被編譯,它將更新導入的模塊。 這是相似的工做。

a = module() # import a

# rest of module

a.update_contents(real_a)

爲了使python可以處理循環依賴,您必須僅使用import x樣式。

import x
class cls:
    def __init__(self):
        self.y = x.y

因爲您再也不在頂層引用模塊的內容,所以python能夠編譯模塊,而無需實際訪問循環依賴項的內容。 頂層是指在編譯過程當中將執行的行,而不是函數的內容(例如y = xy )。 訪問模塊內容的靜態或類變量也會引發問題。


#3樓

我也剛收到這個錯誤,緣由有所不一樣...

from my_sub_module import my_function

主腳本具備Windows行尾。 my_sub_module具備UNIX行結尾。 將它們更改成相同可解決此問題。 它們還須要具備相同的字符編碼。


#4樓

弄清楚邏輯很重要。 出現此問題,由於該引用成爲死循環。

若是您不想更改邏輯,則能夠將致使ImportError的某些import語句放在文件的其餘位置,例如結尾。

py

from test.b import b2

def a1():
    print('a1')
    b2()

b.py

from test.a import a1

def b1():
    print('b1')
    a1()

def b2():
    print('b2')

if __name__ == '__main__':
    b1()

您將收到導入錯誤: ImportError: cannot import name 'a1'

可是,若是咱們改變test.b的位置,將b2導入A以下所示:

py

def a1():
    print('a1')
    b2()

from test.b import b2

咱們能夠獲得咱們想要的:

b1
a1
b2

#5樓

不要使用您導入的其餘模塊的名稱來命名當前的python腳本

解決方案: 重命名工做的python腳本

例:

  1. 您在medicaltorch.py工做
  2. 在該腳本中,您具備: from medicaltorch import datasets as mt_datasets ,其中medicaltorch應該是已安裝的模塊

這將因ImportError而失敗。 只需在1中重命名工做的python腳本便可。

相關文章
相關標籤/搜索