rust python 混合编程注意点
rust可以使用pyo3写python 扩展,同时使用maturin编译发布. 以本人mongo_emb为例子,把踩坑中的注意点记录如下:
-
关于项目结构 :
- 参见 项目链接 https://github.com/wangmarkqi/mongo_emb
- 注意mongo_emb文件夹下core.py 的import from .mongo_emb import PyDatabase, PyCollection 这里的.mongo_emb是cargo的libname,通过这个import是的py和rust发生了关系. 可以想象cargo build后这个文件夹下产生了一个.pyd的py拓展库.
- init.py 暴露了整个库的模块,内部的rust模块在core.py 使用
-
关于交叉编译:
- maturin build 仅仅编译源代码包和本地适配whl
- cago.toml中间的pyo3 = { version = “0.27.1”, features = [“abi3-py38”,“extension-module”, “auto-initialize”] }, abi3保证whl不受到py版本限制.
- 以win为例,以下方法可以编译出linux版本
rustup target add x86_64-unknown-linux-gnu pip install ziglang maturin build --release --target x86_64-unknown-linux-gnu --zig
- 关于发布
- maturin publish仅仅发布源代码和本地适配
- 采用交叉编译把结果拷贝到dist,然后 twine upload dist/* 可以上传交叉编译结果