Python eval kernel

依赖

  • 安装CodeLab Adapter
  • 安装Chrome 浏览器
    • 目前 Scratch 官方团队在陆续支持更多浏览器版本,现阶段使用 Firefox/Chrome 浏览器效果最佳.
    • 建议将其设为默认浏览器.

步骤 1:打开 Codelab Adapter

双击打开 Codelab Adapter。

Codelab Adapter 启动之后,将打开默认浏览器。

步骤 2:打开 Codelab Scratch3

点击 Web UI 上的scratch3链接, 或者点击这儿, 将打开如下页面:

图中箭头所指的小圆点呈现绿色 说明 Codelab Adapter 与 Scratch3.0 的连接正常

步骤 3:hello world

选择对应的 Scratch3 插件:Python 插件

在 Scratch Python 插件里使用 插件启停积木 启动 CodeLab Adapter Python 插件。

执行 Python 代码:

Python 插件将以 eval 执行 Python 代码(只能执行表达式),如果你想使用 exec ,文末有指导。

你可以在插件中添加新的类,来自定义新功能, 我们做了一个范例: PyHelper 源码。你可以使用 PyHelper.open_url("https://www.codelab.club")来为 Scratch 引入打开网页的功能。

你甚至可以更进一步,在 Scratch 中自定义积木!不需要编程 JavaScript,通过 Python 来扩展 Scratch!让我们构建一个打开网页的积木(Scratch本身没有打开网页的功能):

点击制作新的积木:

制作自定义积木,添加输入项目: url 参数.

接下来我们开始定义这个积木的功能,完成之后我们就可以使用它了

以上例子的功能是按下空格,打开 CodeLab 主页。

你可以在插件里添加更多的类似PyHelper的自定义类,来为 Scratch 引入更多新的能力,使用 Python 就行!

延伸

再来做一个例子,@HansonXie 给我写了封邮件,说想写一个extension或者node来进行文件存储,希望用Python来做,而不是Javascript。在此我写个简单例子

我们可以使用 Jupyterlab 编辑extension_python.py. 在其中增加一个新的助手类,来负责存储文件

class StorageHelp:
    def save_text_to_file(text, filename):
        with open(filename, "w"):
            filename.write(text)

之后,将其添加到eval中(使其可用)。

eval(code, {"__builtins__": None}, {
                "PyHelper": self.PyHelper,
                "StorageHelp": StorageHelp()
            })

完成后,重新勾选extension_python.py(stop and start,不需要重启 Adapter)。

此次,自定义的积木,包括两个参数:存储的文本(text) 和 文件名(filename)

提醒

注意文件名和内容都是字符串,有引号"xxxxx"

点击运行新的积木, 在jupyterlab中,可以看到新创建的文件已经在 extensions 目录里

提醒

exec 可能带来各种安全风险,暂时将其从插件市场移走了。eval也更符合我们采用的对象/消息隐喻。
如果你确实需要exec,可以自行构建插件, 参考python_exec.py

内置在 Adapter 里的 Python 插件以 eval 执行 Python 代码(只能执行表达式),如果你希望以功能更轻大的 exec (可执行任何 Python 语句)执行 Python 代码,可以在插件市场里下载 extension_python_exec 插件

关于 eval 和 exec 的区别,参考:

我们之没有将 extension_python_exec 内置在 Adapter 中,而是希望用户在需要时自行下载,因为它的功能过于强大,可能会带来一下风险,所以选择权交由使用者。强大的能力通常会伴随风险,当然我们不会做太多限制,由你决定:)

参考