Rust与Python集成的高效构建与发布工具
Maturin是一款专门用于构建和发布Rust与Python集成项目的工具。它支持pyo3、cffi和uniffi绑定,能够将Rust crate和二进制文件打包为Python包。Maturin可在Windows、Linux、Mac和FreeBSD上为Python 3.8+构建wheels,支持上传至PyPI,并兼容PyPy和GraalPy。该工具简化了Rust和Python的集成过程,无需额外配置,与setuptools-rust和milksnake兼容。通过支持pyproject.toml构建,Maturin为开发者提供了灵活高效的跨语言开发解决方案。
前身为 pyo3-pack
使用最小配置构建并发布带有 pyo3、cffi 和 uniffi 绑定的 crate,以及作为 Python 包的 Rust 二进制文件。 它支持为 Windows、Linux、Mac 和 FreeBSD 上的 Python 3.8+ 构建 wheel,可以将它们上传到 PyPI,并提供基本的 PyPy 和 GraalPy 支持。
查看用户指南!
你可以从最新发布版本下载二进制文件,或者使用 pipx 安装:
pipx install maturin
[!注意]
如果你不想使用 pipx,
pip install maturin
也应该可以正常工作。
有四个主要命令:
maturin new
创建一个配置了 maturin 的新 Cargo 项目。maturin publish
将 crate 构建成 Python 包并发布到 PyPI。maturin build
构建 wheel 并将它们存储在一个文件夹中(默认为 target/wheels
),但不上传它们。可以使用 twine 或 maturin upload
上传这些 wheel。maturin develop
构建 crate 并直接将其作为 Python 模块安装到当前虚拟环境中。请注意,虽然 maturin develop
速度更快,但它不支持在 maturin build
之后运行 pip install
所支持的所有功能。系统会自动检测 pyo3
绑定。对于 cffi 或二进制文件,你需要传递 -b cffi
或 -b bin
。
maturin 不需要额外的配置文件,也不会与现有的 setuptools-rust 或 milksnake 配置冲突。
你甚至可以将其与测试工具(如 tox)集成。
test-crates
文件夹中有不同绑定的示例。
包的名称将是 Cargo 项目的名称,即 Cargo.toml
中 [package]
部分的 name 字段。
模块的名称(即你在导入时使用的名称)将是 [lib]
部分的 name
值(默认为包的名称)。对于二进制文件,它就是 Cargo 生成的二进制文件的名称。
Python 包有两种格式: 一种是称为 wheel 的构建形式,另一种是源代码分发(sdist),两者都是归档文件。 wheel 可以与任何 Python 版本、解释器(主要是 CPython 和 PyPy)、操作系统和硬件架构兼容(对于纯 Python wheel), 也可以限制于特定平台和架构(例如使用 ctypes 或 cffi 时),或限制于特定操作系统和架构上的特定 Python 解释器和版本(例如使用 pyo3)。
当使用 pip install
安装包时,pip 会尝试找到匹配的 wheel 并安装它。如果找不到,它会下载源代码分发并为当前平台构建 wheel,
这需要安装正确的编译器。安装 wheel 比安装源代码分发要快得多,因为构建 wheel 通常很慢。
当你发布可以用 pip install
安装的包时,你会将其上传到官方包存储库 PyPI。
对于测试,你可以使用 Test PyPI,可以通过 pip install --index-url https://test.pypi.org/simple/
使用。
注意,要为 Linux 发布,你需要使用 manylinux Docker 容器,而要从你的仓库发布,你可以使用 PyO3/maturin-action GitHub Action。
对于 pyo3,maturin 只能为已安装的 Python 版本构建包。在 Linux 和 Mac 上,会使用 PATH
中的所有 Python 版本。
如果你没有用 -i
设置自己的解释器,会使用一种启发式 方法来搜索 Python 安装。
在 Windows 上,会使用 Python 启动器(Python.org 安装程序默认安装)中的所有版本和除 base 之外的所有 Conda 环境。你可以使用 list-python
子命令检查哪些版本被选中。
pyo3 会在环境变量 PYTHON_SYS_EXECUTABLE
中设置使用的 Python 解释器,可以从自定义构建脚本中使用。Maturin 可以为 PyPy 构建和上传带有 pyo3 的 wheel,尽管只在 Linux 上测试了 pypy3.7-7.3。
Cffi wheel 与所有 Python 版本(包括 PyPy)兼容。如果没有安装 cffi
并且 Python 在虚拟环境中运行,maturin 会安装它,否则你必须自己安装(pip install cffi
)。
maturin 使用 cbindgen 生成头文件,可以通过在项目根目录中的 cbindgen.toml
文件配置 cbindgen 来自定义。或者,你可以使用将头文件写入 $PROJECT_ROOT/target/header.h
的构建脚本。
基于头文件,maturin 生成一个导出 ffi
和 lib
对象的模块。
use cbindgen; use std::env; use std::path::Path; fn main() { let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); 让我们创建一个 cbindgen::Builder 实例,并设置以下属性: 不包含任何头文件 使用 C 语言 使用指定的 crate 目录 生成绑定 将生成的绑定写入 target/header.h 文件 ```rust let bindings = cbindgen::Builder::new() .with_no_includes() .with_language(cbindgen::Language::C) .with_crate(crate_dir) .generate() .unwrap(); bindings.write_to_file(Path::new("target").join("header.h"));
uniffi 绑定使用 uniffi-rs 从接口定义文件生成 Python ctypes
绑定。uniffi wheels 兼容所有 Python 版本,包括 pypy。
要创建混合 Rust/Python 项目,在 Cargo.toml 旁边创建一个与模块名称(即 Cargo.toml 中的 lib.name
)相同的文件夹,并在其中添加 Python 源代码:
my-project
├── Cargo.toml
├── my_project
│ ├── __init__.py
│ └── bar.py
├── pyproject.toml
├── README.md
└── src
└── lib.rs
你可以在 pyproject.toml
中通过设置 tool.maturin.python-source
来指定不同的 Python 源目录,例如:
pyproject.toml
[tool.maturin] python-source = "python" module-name = "my_project._lib_name"
然后项目结构会如下所示:
my-project
├── Cargo.toml
├── python
│ └── my_project
│ ├── __init__.py
│ └── bar.py
├── pyproject.toml
├── README.md
└── src
└── lib.rs
[!注意]
推荐使用这种结构以避免常见的
ImportError
陷阱
maturin 会将原生扩展作为模块添加到你的 Python 文件夹中。在开发时,maturin 会将原生库复制到 Python 文件夹中,对于 cffi 还会复制粘合代码。你应该将这些文件添加到 .gitignore 中。
使用 cffi 时,你可以执行 from .my_project import lib
,然后使用 lib.my_native_function
。使用 pyo3 时,你可以直接 from .my_project import my_native_function
。
使用 pyo3 后 maturin develop
的示例布局:
my-project
├── Cargo.toml
├── my_project
│ ├── __init__.py
│ ├── bar.py
│ └── _lib_name.cpython-36m-x86_64-linux-gnu.so
├── README.md
└── src
└── lib.rs
在这样做时,还要确保将代码中的模块名称设置为与 module-name
的最后一部分匹配(不包括包路径):
#[pymodule] #[pyo3(name="_lib_name")] fn my_lib_name(_py: Python<'_>, m: &PyModule) -> PyResult<()> { m.add_class::<MyPythonRustClass>()?; Ok(()) }
maturin 支持 PEP 621,你可以在 pyproject.toml
中指定 Python 包元数据。
maturin 合并 Cargo.toml
和 pyproject.toml
中的元数据,pyproject.toml
优先于 Cargo.toml
。
要指定 Python 依赖项,在 pyproject.toml
的 [project]
部分添加 dependencies
列表。这个列表等同于 setuptools 中的 install_requires
:
[project] name = "my-project" dependencies = ["flask~=1.1.0", "toml==0.10.0"]
Pip 允许添加所谓的控制台脚本,这些是执行程序中某些函数的 shell 命令。你可以在 [project.scripts]
部分添加控制台脚本。
键是脚本名称,值是 some.module.path:class.function
格式的函数路径,其中 class
部分是可选的。该函数不带参数调用。示例:
[project.scripts] get_42 = "my_project:DummyClass.get_42"
你还可以在 pyproject.toml
的 project.classifiers
下指定 trove 分类:
[project] name = "my-project" classifiers = ["Programming Language :: Python"]
maturin 支持通过 pyproject.toml
构建。要使用它,在 Cargo.toml
旁边创建一个 pyproject.toml
,内容如下:
[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin"
如果存在带有 [build-system]
条目的 pyproject.toml
,当指定 --sdist
时,maturin 可以构建包的源代码分发。
源代码分发将包含与 cargo package
相同的文件。要仅构建源代码分发,传递不带任何值的 --interpreter
。
然后你可以使用 pip install .
安装你的包。使用 pip install . -v
可以看到 cargo 和 maturin 的输出。
你可以在 [tool.maturin]
下使用 compatibility
、skip-auditwheel
、bindings
、strip
和常见的 Cargo 构建选项(如 features
),就像直接运行 maturin 一样。
对于 cffi 和 bin 项目,bindings
键是必需的,因为这些无法自动检测。目前,所有构建都是在发布模式下进行的(详见此讨论)。
对于使用 cffi 绑定的非 manylinux 构建,你可以使用以下配置:
[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [tool.maturin] bindings = "cffi" compatibility = "linux"
为了向后兼容旧版本的 maturin,manylinux
选项也被接受作为 compatibility
的别名。
要在 sdist 中包含任意文件以供编译使用,请将 include
指定为 path
glob 数组,并将 format
设置为 sdist
:
[tool.maturin] include = [{ path = "path/**/*", format = "sdist" }]
maturin sdist
命令用于仅构建源代码分发,作为 pypa/pip#6041 的解决方法。
出于可移植性考虑,Linux 上的原生 Python 模块只能动态链接少数几个基本上到处都安装的库,因此称为 manylinux。 PyPA 提供了特殊的 Docker 镜像和一个名为 auditwheel 的工具,以确保符合 manylinux 规则。 如果你想在 Linux PyPI 上发布广泛可用的 wheel 包,你需要使用 manylinux Docker 镜像。
自 1.64 版本起,Rust 编译器至少需要 glibc 2.17,所以你至少需要使用 manylinux2014。
对于发布,我们建议使用 manylinux 标志强制使用与镜像相同的 manylinux 版本,例如,如果你在 quay.io/pypa/manylinux2014_x86_64
中构建,请使用 --manylinux 2014
。
如果你设置了 manylinux: 2014
,PyO3/maturin-action GitHub Action 已经会处理这个问题。
maturin 包含 auditwheel 的重新实现,会自动检查生成的库并为 wheel 包赋予适当的平台标签。
如果你的系统 glibc 太新或者你链接了其他共享库,它会分配 linux
标签。
你也可以手动禁用这些检查,直接使用 --manylinux off
来使用原生 Linux 目标。
为了完全符合 manylinux 标准,你需要在 CentOS Docker 容器中编译。pyo3/maturin 镜像基于 manylinux2014 镜像,
并将参数传递给 maturin
二进制文件。你可以这样使用它:
docker run --rm -v $(pwd):/io ghcr.io/pyo3/maturin build --release # 或其他 maturin 参数
请注意,这个镜像非常基础,只包含 Python、maturin 和稳定版 Rust。如果你需要其他工具,可以在 manylinux 容器内运行命令。 参见 konstin/complex-manylinux-maturin-docker 了解一个小型教育示例,或 nanoporetech/fast-ctc-decode 了解实际应用设置。
当为 musl 目标编译时,maturin 本身符合 manylinux 标准。
欢迎所有人为 maturin 做出贡献!有很多方式可以支持这个项目,比如:
如果你想贡献时间给 maturin 并在寻找从哪里开始,我们的贡献说明有更多资源。
如果你没有时间亲自贡献但仍希望支持项目的未来发展,我们的一些维护者有 GitHub 赞助页面:
根据以下两种许可之一授权:
由你选择。
字节跳动发布的AI编程神器IDE
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。
全能AI智能助手,随时解答生活与工作的多样问题
问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。
实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。
一键生成PPT和Word,让学习生活更轻松
讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。
深度推理能力全新升级,全面对标OpenAI o1
科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。
一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型
Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。
AI助力,做PPT更简单!
咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。
选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。
专业的AI公文写作平台,公文写作神器
AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。
OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研 究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号