【问题标题】:How to use Skulpt to eval Python line by line如何使用 Skulpt 逐行评估 Python
【发布时间】:2015-07-09 13:09:13
【问题描述】:

Skulpt 给出的示例对包含 python 程序的整个字符串运行解释器:

https://github.com/skulpt/skulpt/blob/master/example/calling_from_js.html

是否有可能逐行运行解释器,例如为了突出显示当前执行的 Python 行?

提前谢谢你。

【问题讨论】:

    标签: javascript python interpreter skulpt


    【解决方案1】:
    var program = "print('something')\nprint('something else')";
    
    var programs = program.split("\n");
    
    for(var i = 0; i<programs.length; i++){
        //skulpt on `programs[i]` and highlight that line
    }
    

    基本上你只是想做这样的事情:

    1. 将整个程序分成一系列行
    2. 通过 Skulpt 单独运行每一行(根据需要突出显示该行)

    您的第二个链接中的代码稍作修改:

    <script src="../dist/skulpt.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        function outf(text)
        {
            var output = document.getElementById("output");
            text = text.replace(/</g, '&lt;');
            output.innerHTML = output.innerHTML + text;
        }
        function runit(prog)
        {
            //changed this so the function accepts an argument
            var output = document.getElementById("output");
            output.innerHTML = '';
            Sk.configure({output:outf});
            try {
                var module = Sk.importMainWithBody("<stdin>", false, prog);
                var obj = module.tp$getattr('a');
                var runMethod = obj.tp$getattr('run');
                var ret = Sk.misceval.callsim(runMethod, 10);
                alert(ret.v);
            } catch (e) {
                alert(e);
            }
        }
    </script>
    <form>
    <textarea id="code" rows="24" cols="80">
    class Test:
         def run(self, b):
             self.a = 10 + b
             return self.a
    
    print "Hello World"
    a = Test()
    </textarea><br>
    <button onclick="runit()" type="button">Run</button>
    </form>
    
    <pre id="output"></pre>
    

    然后只需将此代码插入您想要的任何位置

    var programs = document.getElementById("code").value;
    
    for(var i = 0; i<programs.length; i++){
        // Whatever code you want to use to highlight the line goes here
        runit(programs[i]);
    }
    

    【讨论】:

    • 谢谢。在给定的线路上调用 skulpt 的方式让我特别感兴趣。我可以在保持上下文的每一行上调用 Sk.importMainWithBody() 吗?
    • 从第二个链接你可以看到runit函数,对吧?这将执行变量prog 中的程序。因此只需将变量prog 更改为您要运行的变量(在本例中为programs[i])。也许如果您愿意,您可以更改函数以接受要运行的字符串,而不是从 HTML 中获取字符串,您应该会很好。这有意义吗?
    • 我刚刚尝试了您的示例,但它不起作用。许多关于未定义对象的消息。我不确定,但可能是因为 skulpt 堆栈以某种方式重新初始化。
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多