为什么不导入会在运行execfile()的python脚本中阻止NameError?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么不导入会在运行execfile()的python脚本中阻止NameError?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2720字,纯文字阅读大概需要4分钟。
内容图文
![为什么不导入会在运行execfile()的python脚本中阻止NameError?](/upload/InfoBanner/zyjiaocheng/783/a19297f6ceb0453a9523656b6d666374.jpg)
当在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(): calling gamelib.play_sound() boom! mhack:exec $
但是,如果我在game.py中注释掉’import gamelib’语句并取消注释script.py中的’import gamelib’,我会收到以下错误:
mhack:exec $python game.py ScriptObject.action(): calling gamelib.play_sound() Traceback (most recent call last): File "game.py", line 10, in main() File "game.py", line 8, in main script_mgr.run() File "/Users/williamknight/proj/test/python/exec/script_mgr.py", line 12, in run obj.action() File "script.py", line 9, in action gamelib.play_sound() NameError: global name 'gamelib' is not defined
我的问题是:1)为什么在’game.py’模块中需要导入,执行脚本的模块? 2)为什么不从引用它的模块(script.py)或调用它的模块(script_mgr.py)导入’gamelib’?
这发生在Python 2.5.1上
解决方法:
从Python documentation for execfile:
execfile(filename [,globals [,locals]])
如果省略locals字典,则默认为globals字典.如果省略两个字典,则表达式在调用execfile()的环境中执行.
execfile有两个可选参数.由于您省略了它们,因此您的脚本将在调用execfile的环境中执行.因此,game.py中的导入会改变行为.
另外,我在game.py和script.py中总结了以下导入行为:
>在game.py中,导入gamelib将gamelib模块导入全局变量和本地变量.这是传递给script.py的环境,这就是为什么可以在ScriptObject操作方法中访问gamelib(从全局访问).
>在script.py导入中,gamelib仅将gamelib模块导入到本地(不确定原因).因此,当尝试从全局变量中从ScriptObject操作方法访问gamelib时,您会遇到NameError.如果您将导入移动到操作方法的范围内,如下所示(将从本地访问gamelib):
class ScriptObject:
def action(self):
import gamelib
print("ScriptObject.action(): calling gamelib.play_sound()")
gamelib.play_sound()
内容总结
以上是互联网集市为您收集整理的为什么不导入会在运行execfile()的python脚本中阻止NameError?全部内容,希望文章能够帮你解决为什么不导入会在运行execfile()的python脚本中阻止NameError?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。