- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当脚本在 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.pyScriptObject.action(): calling gamelib.play_sound()boom!mhack:exec $
但是,如果我注释掉 game.py 中的“import gamelib”语句并取消注释 script.py 中的“import gamelib”,我会收到以下错误:
mhack:exec $ python game.pyScriptObject.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对于执行文件:
execfile(文件名[, globals[, locals]])
如果省略局部字典,则默认为全局字典。如果两个字典都省略,则在调用 execfile() 的环境中执行表达式。
execfile 有两个可选参数。由于您同时省略了它们,因此您的脚本将在调用 execfile 的环境中执行。因此,在 game.py 中导入会改变行为。
另外,我在game.py和script.py中总结了如下import行为:
在 game.py 中,import gamelib
将 gamelib 模块导入到全局变量和局部变量。这是传递给 script.py 的环境,这就是为什么可以在 ScriptObject 操作方法(从全局变量访问)中访问 gamelib 的原因。
在 script.py 中,import gamelib
将 gamelib 模块导入到locals only(不确定原因)。因此,当尝试从全局变量的 ScriptObject 操作方法访问 gamelib 时,您会遇到 NameError。如果您将导入移动到 action 方法的范围内,它将起作用(gamelib 将从本地访问):
class ScriptObject:
def action(self):
import gamelib
print("ScriptObject.action(): calling gamelib.play_sound()")
gamelib.play_sound()
关于python - 为什么在使用 execfile() 运行的 python 脚本中 import 不能防止 NameError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348630/
我遇到了问题,甚至不确定从哪里开始进行故障排除。 我正在使用 slightly modified mocha-casperjs . CasperJS 是 PhantomJS 的包装器。我正在尝试在测试
我想在我的 GUI 中有一个文本框和一个按钮,单击按钮时,它应该获取文本并将其存储在其他文件的变量中,然后运行其他文件。 我希望用户输入访问 token ,GUI 应将其保存在utilities.py
python 文档指出“execfile() 不能可靠地用于修改函数的局部变量。”在页面上http://docs.python.org/2/library/functions.html#execfil
我正在尝试使用 Tkinter 为我的 Python 程序制作一个启动器。我使用了 execfile 函数,幸运的是它打开了目标 GUI。但是,所有按钮都不起作用,它会说大多数函数引用的全局变量未定义
我的结构是这样的: c |-myMain.py |-.....\someDir |-startup.py |-subDir
我有这个功能: #This function loads the tokens for the specified account. If the tokens are not found, it q
标题中提出的问题可能是the XY-Problem的情况, 但我找不到更简洁的描述。我想通过在每个脚本上运行 execfile(filename) 来测试一些 python 脚本,然后查看它们是否触发
我正在尝试将信息加载到用户定义的函数中以供进一步处理。由于输入文件必须由非程序员生成,因此我选择了以下格式: #contents of vessel_data.txt hull_length = 10
我遇到的问题与 this question 中的第一个问题类似,据我所知没有得到答复。 我有一个文件“config.py”,其中包含一个类要使用的大量参数(这个 config.py 文件会更改),但是
是否可以在不使用 if/else 语句的情况下中断使用 execfile 函数调用的 Python 脚本的执行?我试过 exit(),但它不允许 main.py 完成。 # main.py print
我在 ipython shell 内部工作,经常需要重新加载包含正在构建的函数的脚本文件。 在我的 main.py 中我有: def myreload(): execfile("main.py") e
我有一个运行多个 python 代码的代码,如下所示: execfile("1.py") execfile("2.py") execfile("3.py") 但是偶尔上述代码之一会出现错误,我会将 e
我尝试执行 *.exe 文件,但得到: 执行错误:{ 错误:spawn ${__dirname}/install.exe ENOENT 代码: var execFile = require('chil
我正在尝试从用户那里获取文件名,然后使用 execfile() 来执行该文件。下面是我的代码: print "Please enter the name of the file" filename =
我有一个包含序言信息的 config.py 脚本。我可以使用 execfile() 函数来读取配置文件的内容。 execfile("config.py") print PREAMBLE >>> "AB
我正在尝试使用他们的二进制文件连接到 browserstack 并将我的 key 作为参数传递。如果我在终端窗口中执行此操作: ./BrowserStackLocal --key ${BROWSERS
我把一个方法放在文件 mymodule.py 中: def do_something(): global a a=1 如果我尝试 >>> execfile('mymodule.py')
在我的一些 Django 应用程序中,我使用 settings_local.py 文件来覆盖在不同环境(例如开发、测试和生产)中不同的设置。我最初使用以下代码将其内容包含在 settings.py 中
我有一个 Node 脚本,它以这种方式调用外部程序 (PluginManager.exe): const util = require('util'); const execFile = util.p
我使用child_process通过phantomjs执行yslow.js。示例(CLI): phantomjs yslow.js --info all --format json url 我们可以
我是一名优秀的程序员,十分优秀!