python - 运行字符串中包含的 Python 代码

标签 python pygame exec eval

我正在使用 pygame 和 box2d 编写游戏引擎,并且在角色构建器中,我希望能够编写将在按下事件时执行的代码。

我的计划是在角色构建器中有一个文本编辑器,让您编写类似于以下的代码:

if key == K_a:
    ## Move left
    pass
elif key == K_d:
    ## Move right
    pass

我将文本编辑器的内容作为字符串检索,我希望代码在这个字符方法中的方法中运行:

def keydown(self, key):
    ## Run code from text editor

最好的方法是什么?

最佳答案

您可以使用 eval(string)方法来做到这一点。

定义

eval(code, globals=None, locals=None)
该代码只是标准的 Python 代码——这意味着它仍然需要正确缩进。

全局变量可以定义一个自定义的 __builtins__,这对安全目的很有用。

例子

eval("print('Hello')")

将打印 hello 到控制台。您还可以为要使用的代码指定局部和全局变量:

eval("print('Hello, %s'%name)", {}, {'name':'person-b'})

安全问题

不过要小心。将执行任何用户输入。考虑:

eval("import os;os.system('sudo rm -rf /')")

有很多方法可以解决这个问题。最简单的是做类似的事情:

eval("import os;...", {'os':None})

这将引发异常,而不是删除您的硬盘。虽然您的程序是桌面程序,但如果人们重新分发脚本,这可能是一个问题,我想这是有意的。

奇怪的例子

下面是一个使用 eval 的例子,但很奇怪:

def hello() : print('Hello')
def world() : print('world')
CURRENT_MOOD = 'happy'

eval(get_code(), {'contrivedExample':__main__}, {'hi':hello}.update(locals()))

eval 行的作用是:

  1. 为当前模块提供另一个名称(它成为脚本的 contrivedExample)。消费者现在可以调用 contrivedExample.hello()。)
  2. 它将hi定义为指向hello
  3. 它将字典与执行模块中的当前全局变量列表相结合。

失败

事实证明(感谢评论者!)您实际上需要使用 exec 语句。大哎呀。修改后的例子如下:


exec 定义

(这看起来很熟悉!) exec 是一个语句:
执行“代码”[在范围内] 其中范围是局部变量和全局变量的字典。如果未指定,则在当前范围内执行。

代码只是标准的 Python 代码——这意味着它仍然需要适当缩进。

exec 例子

exec "print('hello')"

将打印 hello 到控制台。您还可以为要使用的代码指定局部和全局变量:

eval "print('hello, '+name)" in {'name':'person-b'}

exec 安全问题

不过要小心。将执行任何用户输入。考虑:

exec "import os;os.system('sudo rm -rf /')"

打印报表

评论者也指出,print 是 Python 3.0 之前的所有版本中的语句。在 2.6 中,可以通过键入 from __future__ import print_statement 来更改行为。否则,使用:

print "hello"

代替:

print("hello")

关于python - 运行字符串中包含的 Python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1015142/

相关文章:

python - 在 DataFrame 中为一系列日期创建 id

python - 使用 Visual Studio 在 IronPython 中引用库

python-3.x - Pygame 中更复杂的颜色渐变

mysql - 警告 : system() [function. 系统]:无法在第 19 行执行空白命令

c - popen 创建一个额外的 sh 进程

php - 谁拥有 php exec tar 提取的文件?

python - Pandas 从查找 DataFrame 列中减去 DataFrame 列

python - 带有 numpy ctypes 的大数组

Python:调用有延迟的函数,而不减慢主循环

python - 在用 pygame 制作的游戏中实现菜单