PyO3 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
PyO3 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
PyO3 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
PyO3 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
PyO3 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

PyO3 是 Python 的 Rust 绑定,可以用 Rust 语言对 Python 加速。这包括用 Rust 语言运行 Python 代码并与之交互,以及直接编写原生 Python 模块。

PyO3 一开始只是作为 rust-cpython 的分支出现, 后来由于 rust-cpython 缺乏维护, PyO3 开始在 Rust 社区流行, 随着时间推移 PyO3 与 rust-cpython 有了根本的差异。由于导出包使用 Rust 语言开发,以及 Rust 语言速度快且内存利用率极高,因此在运行效率及性能上优于同等 Python 实现模块。

用法:

PyO3 支持 Python 2.7 和 Python 3.6 及更高版本,Rust 最低版本要求则是 1.45.0。

对于使用 Python 3.6 的用户而言,也可以使用 PyPy 进行构建(通过 cpyext),PyPy 版本要求为 7.3 及以上。详情可以参阅指南中的 pypy 部分。

安装完成之后,就可以在 Rust 中编写原生 Python 模块,也可以在 Rust 二进制文件中使用 Python。

在部分操作系统上,如 Ubuntu 18.04,则需要依赖一些其他软件包所提供的环境,针对这些系统需要运行以下命令:

sudo apt install python3-dev python-dev

在 Python 使用 Rust:

PyO3 可用于生成本地 Python 模块。

Cargo.toml

[package]
name = "string-sum"
version = "0.1.0"
edition = "2018"

[lib]
name = "string_sum"
# "cdylib" is necessary to produce a shared library for Python to import from.
#
# Downstream Rust code (including code in `bin/`, `examples/`, and `tests/`) will not be able
# to `use string_sum;` unless the "rlib" or "lib" crate type is also included, e.g.:
# crate-type = ["cdylib", "rlib"]
crate-type = ["cdylib"]

[dependencies.pyo3]
version = "0.13.1"
features = ["extension-module"]

src/lib.rs

use pyo3::prelude::*;
use pyo3::wrap_pyfunction;

/// Formats the sum of two numbers as string.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

/// A Python module implemented in Rust.
#[pymodule]
fn string_sum(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;

    Ok(())
}

在 Windows 和 Linux 上,可以使用命令cargo build --release正常构建。在 macOS 上,则需要设置其他链接器参数。一种选择是使用cargo rustc --release -- -C link-arg=-undefined -C link-arg=dynamic_lookup进行编译,另一种方法是使用以下命令创建一个.cargo/config

[target.x86_64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

[target.aarch64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

在开发时,可以符号链接或复制(符号链接 symlink,又称软连接)并重新命名目标文件夹的共享库;在 macOS 中,将libstring_sum.dylib重命名为string_sum.so,在 Windows 上将libstring_sum.dll重命名为string_sum.pyd以及在 Linux 上将libstring_sum.so重命名为string_sum.so。然后在同一文件夹中打开一个 Python shell,就能够进行import string_sum操作。

可以使用 maturin 或 setuptools-rust 来构建、测试和发布你创建的 Python 模块。具体的 setuptools-rust 示范用例可以在 examples / word-count 中找到,而 maturin 则无需任何配置即可直接使用。

在 Rust 使用 Python:

如果你想要用 Rust 应用程序在内部创建一个 Python 解释器并使用它来运行Python代码,那么将pyo3按照如下方式添加进Cargo.toml

[dependencies.pyo3]
version = "0.13.1"
features = ["auto-initialize"]

示例程序显示了sys.version的值和当前用户名:

use pyo3::prelude::*;
use pyo3::types::IntoPyDict;

fn main() -> Result<(), ()> {
    Python::with_gil(|py| {
        main_(py).map_err(|e| {
          // We can't display Python exceptions via std::fmt::Display,
          // so print the error here manually.
          e.print_and_set_sys_last_vars(py);
        })
    })
}

fn main_(py: Python) -> PyResult<()> {
    let sys = py.import("sys")?;
    let version: String = sys.get("version")?.extract()?;
    let locals = [("os", py.import("os")?)].into_py_dict(py);
    let code = "os.getenv('USER') or os.getenv('USERNAME') or 'Unknown'";
    let user: String = py.eval(code, None, Some(&locals))?.extract()?;
    println!("Hello {}, I'm Python {}", user, version);
    Ok(())
}

更多关于 PyO3 的示例,可以查看官方指南。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (2)

加载中
python目前自己的2、3版本都不兼容 再加上各种第三方发行版比如pypy,官方得要加油了
03/01 20:45
回复
举报
Python 得加油了,早日实现官方JIT
01/18 19:34
回复
举报
更多评论
暂无内容
2020/12/23 10:57

cbors-一个Python CBOR(de)序列化模块,由Rust提供支持-Maxwell Koo <mjkoo90@gmail.com> Installation Usage Limitat...

cbors-一个Python CBOR(de)序列化模块,由Rust提供支持-Maxwell Koo <mjkoo90@gmail.com> 发布:2020-12-23 10:57:37.130164 作者:Maxwell Koo mjkoo90@gmail.com ### 作者邮箱:Maxwell Koo <mjkoo90@gmail.com> ### 首页:https://github.com/mjkoo/cbors ### 文档:None ### 下载链接 # cbo-rs A Python CBOR (de)serialization module, powered by Rust. Wraps the excellent serde_cbor crate and provides a pythoni...

0
0
发表于行业趋势专区
2019/05/21 21:22

【Rust日报】 2019-05-21:actix-web已经发布了1.0 rc版本

mini-aio: 新的异步IO库 #async AdGear公司(一家实时广告平台)开源的库。这个库采用了与Rust中大多数其他异步IO库完全不同的方法:它实际上受到了Pony编程语言的启发。 因此,它不使用Futures,它不使用async/await,它只提供简单的trait。 比如,你想要实现HTTP server,只需要实现TcpListenNotify trait。该trait包含了listening、connected等方法。然后按正常的方式使用就可以,最终使用该库提供的event loop中执行:event...

0
0
发表于大前端专区
2020/07/29 22:21

WebAssembly 一周一报0728

微信不支持外链,请点击阅读原文,查看文中的资源 WebAssembly 入群请至文末 编者按: 一个新的跑分测试显示 Rust 比 Python 快得多,当然我们早就知道啦。Deno 和 Rocket.rs 升级了新版本,支持 stable Rust。接下来会有不少 WebAssembly 和 Rust 技术活动,不要错过哦! WebAssembly 在云中探索 WASM ExploreWASM 将于2020年8月6日举行,专注于 WebAssembly 用例和云计算框架。这是一个完全免费的线上活动。别错过呦。 WAFlas...

0
0
2020/12/22 00:15

advent-of-code--

advent-of-code-- 发布:2020-12-22 00:15:31.599925 作者: 作者邮箱: 首页:https://github.com/fornwall/advent-of-code 文档:None 下载链接 advent-of-code-python Solutions to Advent of Code implemented in Rust and exposed to Python using PyO3. Usage as a library Add dependency: pip install --upgrade advent-of-code The advent_of_code package exports a single solve function with the following signature...

0
0
2020/12/23 10:45

cantact-支持CANtact控制器局域网设备-Eric Evenchick Getting a Device Installing Command Line Interface Rust ...

cantact-支持CANtact控制器局域网设备-Eric Evenchick 发布:2020-12-23 10:45:05.687817 作者:Eric Evenchick ### 作者邮箱:eric@evenchick.com ### 首页:https://github.com/linklayer/cantact ### 文档:None ### 下载链接 # CANtact Software support for CANtact devices. Includes a driver (see driver/), APIs, and a cross-platform command line interface. Getting a Device CANtact Pro is currently a pre-lau...

0
0
发表于程序人生专区
01/29 00:01

Hacker News 简讯 2021-01-29

最后更新时间: 2021-01-29 23:00 PyO3: Rust Bindings for the Python Interpreter - (github.com/pyo3) PyO3:Python解释器的Rust绑定 得分:91 | 评论:18 Pony – High Performance Safe Actor Programming - (ponylang.io) 小马-高性能安全演员编程 得分:36 | 评论:7 Statement of SEC Regarding Recent Market Volatility - (sec.gov) SEC关于近期市场波动的声明 得分:11 | 评论:0 Hobbyists beat professional designers in...

0
0
发表于软件架构专区
2020/05/03 22:11

在 Rust 代码中编写 Python 是种怎样的体验?

本文为转载摘要,完整版请移步: https://mp.weixin.qq.com/s/YT_HNFDCQ_IyocvBkRNJnA 以下为译文: 大约一年前,我发布了一个名为inline-python(https://crates.io/crates/inline-python)的Rust类库,它允许大家使用python!{ .. }宏轻松地将一些Python混合到Rust代码中。在本系列中,我将从头展示开发此类库的过程。 -1- 预览 如果不熟悉inline-python类库,你可以执行以下操作: fn main() {     let who = "worl...

0
0
发表于行业趋势专区
2019/08/28 22:20

【Rust日报】 2019-08-28:Rust异步代码的优势:相比于其他语言更加容易调试

「系列文章」在Rust中使用C库 #C #FFi 两篇文章介绍了如何绑定C库,并且将其抽象为安全的方法调用。 Part I: https://medium.com/dwelo-r-d/using-c-libraries-in-rust-13961948c72a Part II:https://medium.com/dwelo-r-d/wrapping-unsafe-c-libraries-in-rust-d75aeb283c65 使用async/await构建高性能TCP客户端 #async #await #tcp 作者通过创建了一个TCP客户端的项目Clobber来体验将在1.39中稳定的Async/Await的功能,结论:...

0
0
2020/12/22 17:51

asphalt-面向网络应用的微框架-Alex Grönholm

asphalt-面向网络应用的微框架-Alex Grönholm 发布:2020-12-22 17:51:28.829375 作者:Alex Grönholm ### 作者邮箱:alex.gronholm@nextday.fi ### 首页: ### 文档:None ### 下载链接 .. image:: https://travis-ci.org/asphalt-framework/asphalt.svg?branch=master :target: https://travis-ci.org/asphalt-framework/asphalt :alt: Build Status .. image:: https://coveralls.io/repos/github/asphalt-framework/asp...

0
0
发表于开发技能专区
2020/04/19 20:51

【Rust日报】2020-04-18 rust.cc新域名rustcc.cn,Rust 2019调查问卷结果出炉

消息:rust.cc 搬国内了,新域名是 rustcc.cn,国内访问速度大增 rust.cc 搬国内来了,现在域名是 rustcc.cn。访问以前的域名会重定向过来。但是原来的rss好像不会收到更新了。大家使用过程中有什么问题,请直接与Mike老师联系。 详细通告在这里 ,https://rustcc.cn/article?id=b1ccded3-0d45-4005-837c-ad54cf55ef54 以及 rustcc 源回来了,欢迎大家内测。 详细信息在这里 ,https://rustcc.cn/article?id=f5d0773e-9086-48de...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
2 评论
16 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部