python/ 目录放 Python executor 与 SDK。整体架构见 架构总览,目录分层见 仓库结构。
前置依赖
外部服务在本地开发中都有替身,不需要先搭 etcd、BlockDB、Meta 或链节点:
快速开始
1
克隆并下载 Go 依赖
git 能访问 github.com/Chaintable/*;CI 里通过 GOPRIVATE=github.com/Chaintable/* 和 token 注入解决。2
安装 Python 依赖
python/.venv/ 建 venv。internal/testutil/paths.go 的 pythonBin() 按顺序找 /tmp/blockx-venv/bin/python、python/.venv/bin/python,都没有才退回 python3。venv 缺失时所有 process E2E 会被跳过而不是失败。3
编译与单元测试
cmd/worker 会链接 DuckDB 静态库,比其他包慢很多;之后走构建缓存。go test ./... 会连带跑 process / contract / system E2E(它们不检查 -short),需要上一步的 venv;e2e/perf 默认被 TestMain 跳过。只想跑纯单测用 go test ./internal/... ./api/...。4
跑 Python 单测
5
在本机拉起一个 worker
下面这组变量来自 日志出现
internal/testutil/worker.go 的 StartWorkerAt,是 process E2E 启动真实 worker 用的最小集合:worker listening 和 executor started 即成功。各项含义:ETCD_ENDPOINTS=none:不注册到 etcd,也就没有 Coordinator 参与;客户端直接对 worker 调RequestTaskSlot/SubmitTask。ICEBERG_NAMESPACE:WorkerFullConfig.Validate要求非空(internal/worker/app/config.go)。BLOCKDB_BATCH_WRITE_ADDR:cmd/worker的 block profile 注册了BundleWriteplugin,validateProfileRuntimeConfig要求该地址非空;本地填一个不可达端口即可。STUB_BLOCKDB_DELAY_MS=0:一旦设置了任何BLOCKDB_*_ADDR,worker 会认为 BlockDB 是真实的;这个变量把读路径切回 devstub。
examples/local_test_service/README.md 起 local_proxy.py 再跑 submit.py。也可以直接跑一条 process E2E 看真实调用:Makefile 目标
环境变量与配置文件
worker 的加载顺序在internal/worker/app/app.go 里:DefaultWorkerFullConfig() → profile 的 TuneDefaults → WORKER_CONFIG 指向的 JSON 文件(LoadWorkerFullConfigFrom)→ 环境变量覆盖。JSON 字段名与 WorkerFullConfig 的 json tag 一致,示例见 blockx 仓库 docs/deploy.md §9.3。coordinator 只读环境变量,没有配置文件(internal/coordinator/app/config.go 的 LoadCoordinatorRuntimeConfigFromEnv)。
本地开发最常碰到的变量:
完整表(含 AIMD、gRPC keepalive、Iceberg cache 等几十项)见 blockx 仓库
docs/deploy.md §9;deploy/env/worker.env.example 是 EC2 部署用的 env 文件样例,包含大量宿主机脚本才读的键,不适合直接拿来本地跑。
代码生成
改了.proto 后重新生成 Go 绑定:
Makefile 会把 $(go env GOBIN)(或 $(go env GOPATH)/bin)加进 PATH,所以插件装在默认位置即可。proto 源文件位置:api/grpc/*/ 与 internal/sdk/{blockdb,meta,localtestservice}/proto/。生成结果要一起提交。
常见问题
E2E 全部显示 SKIP,提示 Python dependencies not available
E2E 全部显示 SKIP,提示 Python dependencies not available
internal/testutil/python.go 的 RequirePythonModules 会用探测到的解释器试 import,失败就 t.Skip。cmd/worker 的 process E2E 要求 greenlet, blockx_sdk, blockx_executor, blockdb, blockx, leafage, chaintable 七个模块都能导入(cmd/worker/worker_process_helpers_test.go),后四个来自 pyproject.toml 里的私有 git 依赖。先 uv sync --project python,并确认 python/.venv/bin/python 存在。go build ./cmd/worker 报 build constraints exclude all Go files in duckdb-go-bindings/lib
go build ./cmd/worker 报 build constraints exclude all Go files in duckdb-go-bindings/lib
这是
CGO_ENABLED=0 的症状。worker 与 bundle_worker 必须开 CGO,并且机器上要有 C 编译器。首次链接较慢属正常。worker 启动直接退出:invalid worker config
worker 启动直接退出:invalid worker config
看错误串:
icebergNamespace must not be empty 补 ICEBERG_NAMESPACE;plugin BlockBundleWriteResultHandler requires blockdb.batchWriteAddr 补 BLOCKDB_BATCH_WRITE_ADDR;usage 相关错误补 BLOCKX_USAGE_DISABLED=true。worker 起来了但 Coordinator 看不到它
worker 起来了但 Coordinator 看不到它
检查
ETCD_ENDPOINTS 是否指向同一个 etcd,以及 WORKER_ADDR 是否是 Coordinator 可达的地址;容器网络隔离时必须显式设置(docs/deploy.md §7)。本地单机调试可以直接 ETCD_ENDPOINTS=none 绕过 Coordinator。Python executor 子进程没起来
Python executor 子进程没起来
确认
PYTHON_BIN 指向的解释器能 import blockx_executor(PYTHONPATH 要包含 python/)。默认值 python3 通常是系统解释器,缺 greenlet 等依赖。go mod download 拉不到 github.com/Chaintable/*
go mod download 拉不到 github.com/Chaintable/*
这些是私有模块。配置 git 凭据(例如
git config --global url."git@github.com:".insteadOf "https://github.com/"),并设 GOPRIVATE=github.com/Chaintable/*。Python 侧的 blockx-py 等也是私有 git 依赖,同样需要凭据。