2016-11-10 159 views
0

當我的代碼中的某些模塊相互調用時,調試器出現問題。 實例:Python spyder調試死循環導入

甲文件dog.py包含以下代碼:

import cat 
print("Dog") 

文件cat.py如下:

import dog 
print("Cat") 

當運行dog.py(或貓.py)我沒有任何問題,程序運行平穩。 但是,當我嘗試調試它時,整個spyder凍結,我必須殺死程序。

你知道我該如何解決這個問題?我想使用這個循環導入,因爲模塊使用其他模塊中的函數。

謝謝!

回答

2

當我運行dog.py(或cat.py)時,我沒有任何問題,程序運行順利。

AFAICT這主要是因爲腳本是根據專門的名字("__main__")進口,而模塊是根據它自己的名字(這裏的「狗」或「貓」)的進口。注意:腳本和模塊之間的唯一區別實際上是加載的 - 將參數傳遞給python運行時(python dog.py)或從腳本或任何帶有import語句的模塊導入。

(實際上圓形的進口問題比我上面描述有點複雜,但我會離開這個給別人更有見識。)

爲了使長話短說:除了這個特殊的用途情況下(其實更多的是副作用),Python確實不是支持循環導入。如果您有其他腳本或模塊共享的函數(類,任何),請將這些函數放在不同的模塊中。或者如果您發現兩個模塊確實相互依賴,您可能只想將它們重新組合爲一個模塊(或重新組合在相同模塊中相互依賴的部分以及一個或多個其他模塊中的所有其他部分)。

另外:除非它是一個簡單的one-shot util或者只依賴於stdlib的東西,否則腳本的內容通常會更好地歸結爲解析命令行參數/讀取配置文件/ main,導入所需的模塊並開始有效的過程。

+0

感謝布魯諾。但是,如何在腳本調試時不工作?有什麼不同? – riccio777

+0

@ riccio777我不使用spyder,所以我不能真正知道,但我想它是試圖導入您的模塊進行檢查(在它的真實模塊名稱下),並嘗試處理循環導入時發生錯誤。 –