定制与分发

v3.4 版本之后(近期发布),引入了一个钩子(hook): Adapter 在启动时,将加载运行与 Adapter 处于同一目录下的app_settings.py文件。

app_settings.py 可以是任意 Python 脚本!

典型应用场景

初始化配置信息

app_settings.py 优先级高于user_settings.py

所以你可以使用该钩子配置 Adapter 的行为(诸如开启局域网访问权限,将其作为局域网消息中心)

重新分发 Adapter

近期我们计划发布 full- Adapter 发行版, 将 Adapter Node 的环境(嵌入了 Python 解释器和依赖包)打包分发,用户不需要在本地安装 Python,即可运行 Adapter Node。

这项工作的最初动机是简化 DynamicTable 的使用,由于 DynamicTable 希望进入家庭,开箱可用是设计目标之一。所以我们选择将 环境和 Adapter 整体分发。

目前 Python 社区打包分发的机制五花八门,我几乎试遍了所有的机制。目前最喜欢的技巧是在 hack CMU 的 Calypso 软件时学来的:,它的内部 Python 环境十分复杂,但却做到了开箱可用。

这项工作的一个产物是,开发者可以将 Adapter 的自定义插件,连同整个环境一起分发! Jypyterlab 、 OpenCV 、Tensorflow、 Numpy 等等这些复杂依赖,都能做到开箱可用。

你无需支出什么工作,便可把定制后的整个开发/教学 Python 环境分发给用户。

以上这些都基于app_settings.py钩子!

DynamicTable 的例子

依赖于opencv-contrib-python

它的钩子(app_settings.py)为:

import sys, os, pathlib, platform
if getattr(sys, 'frozen', False):
    executable_path = sys.executable

    if (platform.system() == "Darwin"):
        app_dir = pathlib.Path(executable_path).parents[3]
        PYTHON3_PATH = str(app_dir / "python_env" / "bin" / "python3.7m")
    if platform.system() == "Windows":
        app_dir = pathlib.Path(executable_path).parents[0]
        PYTHON3_PATH = str(app_dir / "python_env" / "python")
    if platform.system() == "Linux":
        app_dir = pathlib.Path(executable_path).parents[0]

生命周期

利用这个钩子,也可以改变 Adapter 的运行生命周期,如果你愿意基于 Adapter 构建可扩展的 Python/Scratch 环境,将变得极其简易。

我看到目前 STEAM/编程教育许多团队在环境打包上,投入了很多人力,但灵活性做的很差。

将其视为 hack 机制, WTFPL

Adapter 主页

todo 可配置。

白名单(允许无 token 使用)

todo 可配置 示例