2016-12-19 51 views
0

我問過幾個人,並且找不到任何可行的問題。我的代碼看起來完全相同,但我試圖爲遊戲導入標題。雖然該函數在源文件中工作,但在導入到另一個文件後,找不到。以下是文件,在cmd中所產生的誤差:導入的函數帶來的錯誤:名稱未定義

Game.py:

from Events import * 
from Character import * 

Opening() 

Character.py:

from Events import * 
from Game import * 

Events.py:

from Game import * 
from Character import * 

def Opening(): 
    print " _____  _   _____      _____      _    _  " 
    print "/ ___|  | |  /___|     /__ \      | |    (_)  " 
    print "\ `--. _ _| |__ ______\ `--. _ __ __ _ ___ ___ |/\/ __ _ ___ ___ _ __ | |__ ___ _ __ _ __ _ " 
    print " `--. \ | | | '_ \______|`--. \ '_ \/_` |/ __/ _ \ | | /_` |/ __/ _ \| '_ \| '_ \/_ \| '__| |/ _` |" 
    print "/\__//|_| | |_) |  /\__//|_) | (_| | (_| __/ | \__/\ (_| | (_| (_) | |_) | | | | (_) | | | | (_| |" 
    print "\____/ \__,_|_.__/  \____/| .__/ \__,_|\___\___| \____/\__,_|\___\___/| .__/|_| |_|\___/|_| |_|\__,_|" 
    print "        | |           | |        " 
    print "        |_|           |_|        " 

但經過在cmd中運行Game.py文件,它會帶來錯誤:

Traceback (most recent call last): 
File "Game.py", line 2, in <module> 
    from Events import * 
File "/tmp/so/Events.py", line 2, in <module> 
    from Game import * 
File "/tmp/so/Game.py", line 8, in <module> 
    Opening() 
NameError: name 'Opening' is not defined 
+2

爲什麼'Events'導入'Game'?另外我建議閱讀[PEP-8](https://www.python.org/dev/peps/pep-0008/)。 – jonrsharpe

+1

試試'import events'' Events.Opening()' –

回答

1

您的問題是循環導入和使用「從導入*」組合。

最好的解決方案是組織您的代碼,以便您不需要循環導入。什麼是循環導入?你有遊戲導入事件,然後導入遊戲。你可以在堆棧跟蹤中看到這個(我編輯了你的問題來包含它),當你看着錯誤發生時執行的那一行。

問題的第二部分是Python的導入機制和「from import *」的工作方式。第一次,Game.py正在執行。遇到的第一行是from Events import *。因此,python通過sys.modules查找並沒有找到模塊Events。所以它開始加載Events.py。加載Events.py將按順序執行這些語句。第一個陳述是from Game import *。由於Game不在sys.modules中,因此將被加載。所以第一個陳述是from Events import *。如果現在看起來很混亂,那麼是的:沒有循環進口。這一次Events被發現在sys.modules但是,它尚未完全初始化,因爲它仍在加載。所以Game找到所有的名字在這個時候Events,這是沒有任何。然後繼續並嘗試在當前範圍內找到名爲Opening的對象,但找不到它。可以說,python只要遇到循環導入就會崩潰,並告訴你不要這樣做,但不會。如果你特別小心,它可能會起作用,但無論如何這是一個壞主意。

+0

謝謝!這完全解決了這個問題。我會記得避免循環進口! –