我很想能够做这两个正在做的事情:
Inventing on principle @18:20 , Live ClojureScript Game Editor
如果你不想看视频,我的问题是:
假设我有这段代码:
....
xs = []
for x in xrange(10):
xs.append(x)
...
我想创建一个环境,我可以在其中执行代码、语句语句并观察/跟踪局部变量/全局变量的变化。也许给它一个变量列表以在本地/全局字典中跟踪。比如单步执行代码和保存状态信息。
最理想的情况是,我想保存每个状态及其关联的上下文数据(本地/全局),这样我就可以验证谓词等。
我想做一些类似 Bret Victor 的 binarySearch 示例的事情 Inventing on principle @18:20
我说得有道理吗?我发现用文字解释起来很复杂,但视频展示了我想尝试的东西:)
谢谢你的时间
我尝试/阅读/谷歌搜索的内容:
code.InteractiveConsole
/code.InteractiveInterpreter
livecoding
模块:似乎适用于纯函数/无状态代码exec
/eval
魔法:似乎我无法获得我想要的细粒度控制。trace
模块似乎也不是这样。- Python eval(compile(...), sandbox), globals go in sandbox unless in def, why? <-- 这接近我想要的,但它编译整个字符串/代码块并一步运行。如果我可以运行这样的文件,但检查每一行/语句之间的局部变量..
- run python source code line by line <-- 这不是我想要的
- How do Ruby and Python implement their interactive consoles? <-- 这个主题建议我进一步研究
code
模块
我的下一步将研究 ast
并编译代码并一点一点地运行它,但我确实需要一些指导。我是否应该更多地研究反射和 检查
-模块??
我用过 the Spin model checker以前,但它使用自己的 DSL,我只是喜欢用实现语言(在本例中为 Python)进行建模。
哦,顺便说一句,我知道沙盒代码的安全隐患,但我并没有尝试创建一个安全的执行环境,我正在尝试创建一个交互性很强的环境,例如针对粗略的模型检查或谓词断言.
最佳答案
在我的 initial success 之后使用 sys.settrace()
,我最终切换到 the ast
module (抽象语法树)。我解析我想要分析的代码,然后在每次赋值后插入新调用以报告变量名称及其新值。我还插入调用以报告循环迭代和函数调用。然后我执行修改后的树。
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 Victor 的实时编码工具,您可以看到我的工作代码 on GitHub ,以及它如何表现的一些例子 in the test .您还可以从 the project page 找到演示视频、教程和下载的链接。 .
关于python - 沙盒/逐行运行 python 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670931/