当前位置: 首页 > 面试题库 >

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

商运锋
2023-03-14
问题内容

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

我的计划是在字符生成器中有一个文本编辑器,使您可以编写类似于以下内容的代码:

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

我将以字符串的形式检索文本编辑器的内容,并且我希望代码在此Character方法的方法中运行:

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()))

这在评估线上的作用是:

  1. 给当前模块另一个名称(该名称成为contrivedExample脚本名称)。消费者可以立即致电contrivedExample.hello()。)
  2. 它定义hi为指向hello
  3. 它将该字典与执行模块中的当前全局变量列表结合在一起。

失败

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

exec 定义

(这看起来很熟悉!)Exec是一条语句:
exec "code" [in scope] 其中scope是局部变量和全局变量的字典。如果未指定,它将在当前范围内执行。

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

exec

exec "print('hello')"

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

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

exec 安全问题

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

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

打印声明

正如评论者所指出的那样,它print是3.0之前的所有Python版本中的声明。在2.6中,可以通过键入来更改行为from __future__import print_statement。否则,请使用:

print "hello"

代替 :

print("hello")


 类似资料:
  • 问题内容: 我在String中有一段Java代码。 是否可以将此Java String转换为Java语句并运行它?可能使用Java反射? 问题答案: 正如已经建议的那样,您可以使用Compiler API即时编译,保存和运行代码。 另一个简洁的选择是使用beanshell。Beanshell不再积极开发,但是我可以保证它的可靠性,我已经在多个生产项目中成功使用了它。

  • 本文向大家介绍如何在Python中执行包含Python代码的字符串?,包括了如何在Python中执行包含Python代码的字符串?的使用技巧和注意事项,需要的朋友参考一下 如果要执行Python语句,可以使用exec(string)。例如, 但是,如果您只想评估表达式的值,则可以使用。例如,  注意:同时使用eval和exec时请务必谨慎,因为它们是非常强大的功能 并可能在您的代码中引起非常细小的

  • 问题内容: 我使用的是Max OS X 10.10.3,在没有模块存在之前,我终于在Python 3中对此进行了展示。 但是,现在当我尝试或时,我收到消息: 是否有任何Mac用户(使用Python 3)知道出了什么问题?有人使用过Zelle书和他的模块吗?谢谢。 问题答案: 为了后代:我遇到了同样的问题,并使用 该文件似乎以多种方式弄乱了(错误的结尾等);不知道怎么… 参见: 使用以下sed命令删

  • 主要内容:Python字符串和数字的拼接在 Python 中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" "str2" strname 表示拼接以后的字符串变量名,str1 和 str2 是要拼接的字符串内容。使用这种写法,Python 会自动将两个字符串拼接在一起。 【示例】以连续书写的形式拼接字符串: 运行结果: Python教程https://www.xnip.cn/

  • 问题内容: 有没有更好的方法来编写jUnit 问题答案: 如果添加Hamcrest和JUnit4,则可以执行以下操作: 通过一些静态导入,它看起来要好得多: 所需的静态导入将是:

  • 我希望我能找到一些帮助。我是solr的新手,有机会参加一个关于它的讨论。对于以下情况,即使是主持讲座的顾问也不确定,因此我希望有人也有同样的问题。 我有一个由特定键标识的对象列表。例如:有50万名员工通过id(1-500000)标识。这些人中的每个人都必须在接下来的两年里工作。这些年的每一天都由一个字符标识(员工将工作——“A”,员工将不在工作——“B”)。所以每个员工都有一个最多包含730个字符