首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >沙箱/逐行运行python代码

沙箱/逐行运行python代码
EN

Stack Overflow用户
提问于 2012-03-12 16:26:47
回答 7查看 2.3K关注 0票数 14

我很想能做这两个人正在做的事情:

发明原则@18:20实时ClojureScript游戏编辑器

如果你不想看视频,我的问题是:

假设我有这样的代码:

代码语言:javascript
复制
....
xs = []
for x in xrange(10):
    xs.append(x)
...

我想要创建一个环境,在这个环境中,我可以执行代码、语句和监视/跟踪局部变量/全局变量。也许可以给它一个vars列表,以便在本地/全球词典中记录下来。比如遍历代码并保存状态信息。

最优情况下,我希望保存每个状态,并保存与其相关的上下文-数据(局部变量/全局数据),以便例如验证谓词。

我想做一些类似布雷特·维克多的binarySearch样例发明原则@18:20的事情

说得通吗?,我觉得用文本来解释是很复杂的,但是视频展示了我想尝试的东西:)

耽误您时间,实在对不起

我尝试过/阅读/谷歌的内容:

我的下一步将是查看ast,编译代码并一点一点地运行它,但我确实需要一些指导。我应该更多地研究反射和inspect-module吗??

我以前使用过自旋模型检验器,但它使用了自己的DSL,我只想用实现语言进行建模,在本例中是python。

哦和BTW --我知道沙箱代码的安全含义,但我不是试图创建一个安全的执行环境,而是试图创建一个非常交互式的环境,例如,用于粗糙的模型检查或谓词断言。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-09-06 16:35:13

在使用了初步成功sys.settrace()之后,我最终切换到了模块 (抽象语法树)。我解析要分析的代码,然后在每个赋值之后插入新的调用,以报告变量名及其新值。我还插入调用来报告循环迭代和函数调用。然后执行修改后的树。

代码语言:javascript
复制
        tree = parse(source)

        visitor = TraceAssignments()
        new_tree = visitor.visit(tree)
        fix_missing_locations(new_tree)

        code = compile(new_tree, PSEUDO_FILENAME, 'exec')

        self.environment[CONTEXT_NAME] = builder
        exec code in self.environment

我正在开发一个像Bret这样的实时编码工具,您可以看到我的工作代码论GitHub,以及它如何运行在试验中的一些例子。您还可以从项目页面找到到演示视频、教程和下载的链接。

票数 8
EN

Stack Overflow用户

发布于 2012-05-16 06:25:18

更新:在这一技术获得初步成功之后,我转而使用ast模块,如我的另一个答案中所述。

sys.settrace()似乎工作得很好。我以您提到的黑客问题安德鲁·达尔克的文章为例,给出了一个简单的示例。

代码语言:javascript
复制
import sys

def dump_frame(frame, event, arg):
    print '%d: %s' % (frame.f_lineno, event)
    for k, v in frame.f_locals.iteritems():
        print '    %s = %r' % (k, v)
    return dump_frame

def main():
    c = 0
    for i in range(3):
        c += i

    print 'final c = %r' % c

sys.settrace(dump_frame)

main()

我必须解决两个问题才能让这件事奏效。

  1. 如果要继续跟踪,跟踪函数必须返回自身或另一个跟踪函数。
  2. 跟踪似乎只在第一个函数调用之后才开始。我最初没有主方法,只是直接进入了一个循环。

这是输出:

代码语言:javascript
复制
9: call
10: line
11: line
    c = 0
12: line
    i = 0
    c = 0
11: line
    i = 0
    c = 0
12: line
    i = 1
    c = 0
11: line
    i = 1
    c = 1
12: line
    i = 2
    c = 1
11: line
    i = 2
    c = 3
14: line
    i = 2
    c = 3
final c = 3
14: return
    i = 2
    c = 3
38: call
    item = <weakref at 0x7febb692e1b0; dead>
    selfref = <weakref at 0x17cc730; to 'WeakSet' at 0x17ce650>
38: call
    item = <weakref at 0x7febb692e100; dead>
    selfref = <weakref at 0x7febb692e0a8; to 'WeakSet' at 0x7febb6932910>
票数 5
EN

Stack Overflow用户

发布于 2012-03-12 16:50:30

听起来您需要bdb,这是python调试器库。它是内置的,文档在这里:http://docs.python.org/library/bdb.html

它不具备您似乎想要的所有功能,但它是开始实现它的一个明智的地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9670931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档