当脚本在 Python 中使用 exec 语句或 execfile() 运行时,我查看了许多关于 NameError 异常的现有问题,但尚未找到对以下行为的良好解释。
我想制作一个简单的游戏,在运行时使用 execfile() 创建脚本对象。下面是演示问题的 4 个模块(请多多包涵,这很简单!)。主程序只是使用 execfile() 加载脚本,然后调用脚本管理器来运行脚本对象:
# game.py
import script_mgr
import gamelib # must be imported here to prevent NameError, any place else has no effect
def main():
execfile("script.py")
script_mgr.run()
main()
脚本文件只是创建一个播放声音的对象,然后将该对象添加到脚本管理器中的列表中:
script.py
import script_mgr
#import gamelib # (has no effect here)
class ScriptObject:
def action(self):
print("ScriptObject.action(): calling gamelib.play_sound()")
gamelib.play_sound()
obj = ScriptObject()
script_mgr.add_script_object(obj)
脚本管理器只是调用每个脚本的 action() 函数:
# script_mgr.py
#import gamelib # (has no effect here)
script_objects = []
def add_script_object(obj):
script_objects.append(obj)
def run():
for obj in script_objects:
obj.action()
gamelib 函数定义在第四个模块中,访问起来比较麻烦:
# gamelib.py
def play_sound():
print("boom!")
上面的代码适用于以下输出:
mhack:exec $ python game.py ScriptObject.action():调用 gamelib.play_sound() 繁荣! mhack:执行 $
但是,如果我注释掉 game.py 中的“import gamelib”语句并取消注释 script.py 中的“import gamelib”,我会收到以下错误:
mhack:exec $ python game.py ScriptObject.action():调用 gamelib.play_sound() 回溯(最近一次通话最后): 文件“game.py”,第 10 行,在 主要的() 文件“game.py”,第 8 行,在 main script_mgr.run() 文件“/Users/williamknight/proj/test/python/exec/script_mgr.py”,第 12 行,运行中 obj.action() 文件“script.py”,第 9 行,正在运行 gamelib.play_sound() NameError:未定义全局名称“gamelib”
我的问题是:1)为什么在执行脚本的“game.py”模块中需要导入?2)为什么从引用它的模块(script.py)或调用它的模块(script_mgr.py)导入'gamelib'不起作用?
这发生在 Python 2.5.1