<p>“导入游戏库”的原因脚本.py没有效果是因为它进口到了本地范围内游戏.pymain(),因为这是执行导入的范围。此作用域不是的可见作用域脚本对象.action()执行时。在</p>
<p>添加调试代码以打印globals()和locals()中的更改,将显示以下修改后的程序版本中发生的情况:</p>
<pre><code># game.py
import script_mgr
import gamelib # puts gamelib into globals() of game.py
# a debug global variable
_game_global = "BEF main()"
def report_dict(d):
s = ""
keys = d.keys()
keys.sort()
for i, k in enumerate(keys):
ln = "%04d %s: %s\n" % (i, k, d[k])
s += ln
return s
def main():
print(" - game(): BEF exec: globals:\n%s" % (report_dict(globals())))
print(" - game(): BEF exec: locals:\n%s" % (report_dict(locals())))
global _game_global
_game_global = "in main(), BEF execfile()"
execfile("script.py")
_game_global = "in main(), AFT execfile()"
print(" - game(): AFT exec: globals:\n%s" % (report_dict(globals())))
print(" - game(): AFT exec: locals:\n%s" % (report_dict(locals())))
script_mgr.run()
main()</code></pre>
^{pr2}$
<p>以下是程序的调试输出:</p>
<pre> - 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!</pre>
<p>而不是试图进口游戏.py或模块级别脚本.py,我将遵循Yukiko的建议,将import语句放在脚本对象成员函数的本地范围内。这在我看来有点尴尬,也许有更好的方法可以为exec脚本指定这样的导入,但至少我现在明白了发生了什么。在</p>