我很想能做这两个人正在做的事情:
发明原则@18:20,实时ClojureScript游戏编辑器
如果你不想看视频,我的问题是:
假设我有这样的代码:
....
xs = []
for x in xrange(10):
xs.append(x)
...我想要创建一个环境,在这个环境中,我可以执行代码、语句和监视/跟踪局部变量/全局变量。也许可以给它一个vars列表,以便在本地/全球词典中记录下来。比如遍历代码并保存状态信息。
最优情况下,我希望保存每个状态,并保存与其相关的上下文-数据(局部变量/全局数据),以便例如验证谓词。
我想做一些类似布雷特·维克多的binarySearch样例发明原则@18:20的事情
说得通吗?,我觉得用文本来解释是很复杂的,但是视频展示了我想尝试的东西:)
耽误您时间,实在对不起
我尝试过/阅读/谷歌的内容:
code.InteractiveConsole / code.InteractiveInterpreterlivecoding模块:似乎适用于纯功能/无状态代码exec / eval魔术:似乎我无法得到我想要的细粒度控制。trace模块似乎也不是这样的。code模块我的下一步将是查看ast,编译代码并一点一点地运行它,但我确实需要一些指导。我应该更多地研究反射和inspect-module吗??
我以前使用过自旋模型检验器,但它使用了自己的DSL,我只想用实现语言进行建模,在本例中是python。
哦和BTW --我知道沙箱代码的安全含义,但我不是试图创建一个安全的执行环境,而是试图创建一个非常交互式的环境,例如,用于粗糙的模型检查或谓词断言。
发布于 2012-09-06 16:35:13
在使用了初步成功和sys.settrace()之后,我最终切换到了模块 (抽象语法树)。我解析要分析的代码,然后在每个赋值之后插入新的调用,以报告变量名及其新值。我还插入调用来报告循环迭代和函数调用。然后执行修改后的树。
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,以及它如何运行在试验中的一些例子。您还可以从项目页面找到到演示视频、教程和下载的链接。
发布于 2012-05-16 06:25:18
更新:在这一技术获得初步成功之后,我转而使用ast模块,如我的另一个答案中所述。
sys.settrace()似乎工作得很好。我以您提到的黑客问题和安德鲁·达尔克的文章为例,给出了一个简单的示例。
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()我必须解决两个问题才能让这件事奏效。
这是输出:
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>发布于 2012-03-12 16:50:30
听起来您需要bdb,这是python调试器库。它是内置的,文档在这里:http://docs.python.org/library/bdb.html
它不具备您似乎想要的所有功能,但它是开始实现它的一个明智的地方。
https://stackoverflow.com/questions/9670931
复制相似问题