我有四個不一樣的文件,分別命名爲: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
雖然您絕對應該避免循環依賴,但能夠推遲python中的導入。 orm
例如: ci
import SomeModule def someFunction(arg): from some.dependency import DependentClass
這(至少在某些狀況下)將避免該錯誤。 get
這是循環依賴性。 無需對代碼進行任何結構修改便可解決。 出現問題是由於在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
)。 訪問模塊內容的靜態或類變量也會引發問題。
我也剛收到這個錯誤,緣由有所不一樣...
from my_sub_module import my_function
主腳本具備Windows行尾。 my_sub_module
具備UNIX行結尾。 將它們更改成相同可解決此問題。 它們還須要具備相同的字符編碼。
弄清楚邏輯很重要。 出現此問題,由於該引用成爲死循環。
若是您不想更改邏輯,則能夠將致使ImportError的某些import語句放在文件的其餘位置,例如結尾。
from test.b import b2 def a1(): print('a1') b2()
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以下所示:
def a1(): print('a1') b2() from test.b import b2
咱們能夠獲得咱們想要的:
b1 a1 b2
不要使用您導入的其餘模塊的名稱來命名當前的python腳本
解決方案: 重命名工做的python腳本
例:
medicaltorch.py
工做 from medicaltorch import datasets as mt_datasets
,其中medicaltorch
應該是已安裝的模塊 這將因ImportError
而失敗。 只需在1中重命名工做的python腳本便可。