我问过几个人,找不到任何有效的问题。我的代码看起来很相似,但我正在尝试导入游戏的标题。虽然该函数在源文件中有效,但在导入到另一个文件后,找不到它。以下是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
答案 0 :(得分:1)
您的问题是循环导入和使用&#34;导入*&#34;。
的组合最佳解决方案是组织代码,以便您不需要循环导入。什么是循环导入?您有游戏导入事件,然后导入游戏。当您查看错误发生时正在执行的行时,您可以在stacktrace(我编辑您的问题以包含它)中看到这一点。
问题的第二部分是Python的导入机制和来自导入*&#34;的方式。作品。第一次,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一旦遇到循环导入就会崩溃,并告诉你不要这样做,但它并没有。它可能会有用,如果你格外小心,但无论如何这都是一个坏主意。