4
|
William Knight · 技术社区 · 14 年前 |
1
3
从 Python documentation 对于execfile: execfile(文件名[,全局变量[,局部变量]]) 如果省略了locals字典,则默认为globals字典。如果省略这两个字典,则在调用execfile()的环境中执行表达式。 execfile有两个可选参数。由于省略了它们,因此脚本将在调用execfile的环境中执行。因此,game.py中的导入更改行为的原因。 此外,我还总结了game.py和script.py中导入的以下行为:
|
2
0
script.py中的“import gamelib”无效的原因是它导入到game.py main()的本地作用域中,因为这是执行导入的作用域。此作用域在执行时不是scriptobject.action()的可见作用域。 添加调试代码以打印globals()和locals()中的更改,可以揭示程序的以下修改版本中发生的情况:
以下是程序的调试输出: --- game(): BEF exec: globals: 0000 __builtins__: 0001 __doc__: None 0002 __file__: game.py 0003 __name__: __main__ 0004 _game_global: BEF main() 0005 gamelib: 0006 main: 0007 report_dict: 0008 script_mgr: --- game(): BEF exec: locals: --- game(): AFT exec: globals: 0000 __builtins__: 0001 __doc__: None 0002 __file__: game.py 0003 __name__: __main__ 0004 _game_global: in main(), AFT execfile() 0005 gamelib: 0006 main: 0007 report_dict: 0008 script_mgr: --- game(): AFT exec: locals: 0000 ScriptObject: __main__.ScriptObject 0001 gamelib: 0002 obj: 0003 pdb: 0004 script_mgr: --- ScriptObject.action(): globals: 0000 __builtins__: 0001 __doc__: None 0002 __file__: game.py 0003 __name__: __main__ 0004 _game_global: in main(), AFT execfile() 0005 gamelib: 0006 main: 0007 report_dict: 0008 script_mgr: --- ScriptObject.action(): locals: 0000 report_dict: 0001 self: boom! 我不会尝试将导入放到game.py或script.py的模块级别,而是按照yukiko的建议,将导入语句放在script对象成员函数的本地范围内。这对我来说似乎有点尴尬,也许有更好的方法来为exec脚本指定这样的导入,但至少我现在知道发生了什么。 |