您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

您可以使用该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()))

这在评估线上的作用是:

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

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

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

exec "print('hello')"

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

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

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

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

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

print "hello"

代替 :

print("hello")
python 2022/1/1 18:36:43 有225人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶