2016-12-19 5 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.pyで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

なぜ 'イベント'は 'ゲーム'をインポートしますか?また、[PEP-8](https://www.python.org/dev/peps/pep-0008/)を読むことをお勧めします。 – jonrsharpe

+1

'import events'を試してください。' Events.Opening() ' –

答えて

1

問題は、循環インポートと "from import *"を組み合わせたものです。

最適な解決策は、循環インポートを必要としないようにコードを整理することです。循環インポートとは何ですか?あなたはゲームをインポートするゲームインポートイベントを持っています。エラーが発生した時点で実行中の行を見ると、stacktrace(これを含めるように質問を編集しました)でこれを見ることができます。

問題の第2の部分は、Pythonのインポートメカニズムと "from import *"の仕組みです。初めて、Game.pyが実行されています。遭遇した最初の行はfrom Events import *です。したがって、Pythonはsys.modulesを見て、モジュールEventsは見つかりません。それで、Events.pyが読み込まれます。 Events.pyをロードすると、順番にステートメントが実行されます。最初の文はfrom Game import *です。 Gamesys.modulesにありませんので、ロードされます。したがって、最初の文はfrom Events import *です。これが今混乱していると思われる場合は、そうです:循環的な輸入はありません。今回はEventssys.modulesに見つかりました。 ただし、はまだロードされているため完全に初期化されていません。したがって、Gameは、この時点でと定義されたすべての名前を見つけます。Eventsには何もありません。それから、それは続けられ、現在のスコープ内でOpeningという名前のオブジェクトを見つけようとしますが、それを見つけることはできません。おそらく、Pythonは循環インポートに遭遇するとただちにクラッシュし、そうしないように指示しますが、そうはしません。それはあなたが余分な注意を払うなら、うまくいくかもしれませんが、とにかくそれは悪い考えです。

+0

ありがとう!それは問題を完全に解決しました。私は循環輸入を避けることを忘れないだろう! –

関連する問題