如何从源码编译 JuiceFS Python SDK 得到可用的 whl 包
【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs
JuiceFS Python SDK 适用于无法使用 FUSE 挂载的容器化或虚拟化环境。如果你的目标是在这类环境中通过 Python 访问 JuiceFS 文件系统,就需要先从源码编译出一个可安装的 whl 包,然后在目标机器上用pip安装并验证它可用。
编译有两条路径:直接编译(当前环境需要go1.20+、make、python3)和Docker 容器编译(需要Docker、make、go1.20+,宿主机不需要装 Go 工具链以外的 SDK 构建依赖)。两条路径的入口相同:克隆仓库并进入 SDK 目录。
# Clone JuiceFS repository git clone https://gitcode.com/GitHub_Trending/ju/juicefs # Enter JuiceFS SDK directory cd juicefs/sdk/python后续所有命令都在sdk/python目录下执行。
路径一:直接编译
直接在当前环境编译,产物分为两步:先编译 Go 原生库 libjfs,再打包 Python wheel。
第 1 步:编译 libjfs 原生库
make libjfs这一步会执行go build -buildmode c-shared,把 sdk/python/Makefile 中指向../java/libjfs的 Go 代码编译成共享库。编译完成后,原生库(Linux 上是libjfs.so,macOS 上是libjfs.dylib,Windows 上是libjfs.dll)和头文件libjfs.h会放在sdk/python/juicefs/juicefs目录。可以确认该目录下出现了libjfs.so(或对应平台的后缀)再进入下一步。
第 2 步:编译 Python SDK
cd juicefs && python3 -m build -w这一步使用 Python 的build模块打包,-w表示输出 wheel 文件。编译完成的 Python SDK 位于juicefs/sdk/python/dist目录,文档给出的包名示例为juicefs-1.3.0-py3-none-any.whl。
直接编译路径不会修改 sdk/python/juicefs/setup.py,包名中的版本取自其中硬编码的VERSION = "1.3.0",因此直接编译得到的文件名与文档示例一致。
路径二:使用 Docker 容器编译(可选)
如果本机不想直接跑 Go 构建,可以用项目自带的构建镜像编译,前提是系统已安装Docker、make和go1.20+。
第 1 步:构建 Docker 镜像
# For arm64 make arm-builder # For amd64 make builder两个目标分别基于 Dockerfile.builder.arm 和 Dockerfile.builder 构建,镜像名都是sdkbuilder,按机器架构二选一即可。
第 2 步:执行 make juicefs
make juicefs执行前需要知道这个目标会做三件事(见 sdk/python/Makefile):
- 用
sudo rm -rf juicefs.egg-info删除本地的juicefs.egg-info缓存目录; - 用
sed把 setup.py 的VERSION和BUILD_INFO改写为构建时的版本信息; - 启动
sdkbuilder容器,把仓库根目录挂载到容器的/opt/jfs,在容器内执行make libjfs.so && cd juicefs && python3 -m build -w。
编译完成后,Python SDK 同样位于juicefs/sdk/python/dist目录。
注意:由于第 2 点,Docker 路径下 whl 文件名与文档示例juicefs-1.3.0-py3-none-any.whl可能不一致——VERSION会被改写为 pkg/version/version.go 中的版本号(本仓库当前 checkout 为 1.5.0)加上 UTC 构建时间戳,例如形如juicefs-1.5.0.YYYYMMDDHHMM-py3-none-any.whl。以dist目录实际生成的文件名为准。
确认 whl 包已生成
无论走哪条路径,检查sdk/python/dist目录:
ls sdk/python/dist目录中应出现juicefs-*.whl文件(直接编译为juicefs-1.3.0-py3-none-any.whl,Docker 编译带版本与时间戳,见上节说明)。这就是可以在目标机器上分发的安装包。
安装并验证 whl 可用
把编译好的 whl 文件拷到目标机器,用pip安装:
pip install juicefs-1.3.0-py3-none-any.whl(文件名以你实际生成的为准。)安装后先确认包能被导入:
import juicefs help(juicefs.Client)help()或dir(juicefs.Client)能正常输出类和成员列表,说明 whl 安装成功。
进一步验证需要访问一个真实的 JuiceFS 文件系统。这里有一个文档明确给出的限制:Python SDK 目前不支持 format 文件系统,所以你必须已经有一个创建好的 JuiceFS 文件系统。文档示例假设已存在名为myfs的文件系统,元数据引擎地址为redis://192.168.1.8/0(这是文档示例值,请替换为你自己的文件系统名和元数据引擎 URL):
from juicefs import Client # Create JuiceFS client jfs = Client(name='', meta='redis://192.168.1.8/0') # List files in a directory jfs.listdir('/')listdir('/')能返回目录中的文件列表,说明 whl 包可以正常使用。如果你的项目用fsspec接口(例如对接 Ray 等框架),可以另装fsspec并通过juicefs.spec.JuiceFS使用,属于可选用法,不影响 whl 本身的验证。
遇到 sed invalid command code 报错时如何处理
如果编译过程中出现类似下面的报错:
sed: 1: "juicefs/setup.py": invalid command code j文档给出的处理方式是:尝试把 Makefile 中juicefs目标里的sed相关命令注释掉。副作用是setup.py的VERSION和BUILD_INFO不会被改写,包版本将保持 setup.py 中的默认值(setup.py 中已注释说明这两行“在 Make 过程中会被替换为实际版本号”)。注释掉 sed 后重新执行make juicefs即可继续编译。
限制
- SDK 不支持格式化(format)文件系统,使用前必须已有创建好的 JuiceFS 文件系统,
Client的第一个参数是文件系统名,meta参数是元数据引擎 URL。 - whl 包名中的版本号取决于构建路径与构建时的版本文件,直接编译与 Docker 编译可能不同(见“确认 whl 包已生成”一节),不要假设固定文件名。
- 更完整的 SDK 用法说明(fsspec 集成、Ray 等)可参考 Python SDK 文档,构建细节可对照 sdk/python/Makefile 与 sdk/python/Dockerfile.builder。
【免费下载链接】juicefsJuiceFS is a distributed POSIX file system built on top of Redis and S3.项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考