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 {

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 的示例,可以查看官方指南。

rust edition python3_PyO3首页、文档和下载 - Python 解释器的 Rust 绑定相关推荐

  1. python开源项目博客_Blog_mini首页、文档和下载 - Python Flask开源博客 - OSCHINA - 中文开源技术交流社区...

    使用Blog_mini,你完全不用担心博客的管理问题! Blog_mini是一个用Python Flask开发的,拥有简洁页面(支持响应式布局!)和强大后台管理功能的开源博客系统,使用Blog_min ...

  2. python简介pdf_PDFMiner首页、文档和下载 - Python PDF 解析器 - OSCHINA - 中文开源技术交流社区...

    PDFMiner 是一个 Python 的 PDF 解析器,可以从 PDF 文档中提取信息.与其他 PDF 相关的工具不同,它侧重的是获取和分析文本数据.PDFMiner 允许获取某一页中文本的准确位 ...

  3. python语言依赖平台_poetry首页、文档和下载 - Python 依赖管理和打包工具 - OSCHINA - 中文开源技术交流社区...

    poetry 是一个包管理和打包的工具. 在 Python 中,对于初学者来说,打包系统和依赖管理是非常复杂和难懂的.即使对于经验丰富的开发者,一个项目总是要同时创建多个文件: `setup.py` ...

  4. python网络开发框架_greenev首页、文档和下载 - Python网络服务框架 - OSCHINA - 中文开源技术交流社区...

    greenev是一个基于greenlet协程,事件驱动,非阻塞socket模型的Python网络服务框架,它使得可以编写同步的代码,却得到异步执行的优点.reactor模式采用基于epoll, kqu ...

  5. python网站框架下载_web.py首页、文档和下载 - Python框架 - OSCHINA - 中文开源技术交流社区...

    web.py是一个小巧灵活的Python框架,它简单而且功能强大. webpy的设计理念力求精简(Keep it simple and powerful),源码很简短,只提供一个框架所必须的东西,不依 ...

  6. python开发自动化测试工具_Moler首页、文档和下载 - Python 编写真的自动化测试工具包 - OSCHINA - 中文开源技术交流社区...

    Moler 是为构建自动化测试提供"砖块"的 Python 库. 所有这些"砖头"都有明确的责任,有类似的API,遵循相同的构造模式(所以很容易创建新的测试). ...

  7. python colors属于哪个包,Colour首页、文档和下载 - Python 颜色科学软件包

    Color是一个Python颜色科学软件包,实现了大量的颜色理论转换和算法. 安装:$ pip install colour-science 示例代码: >>> import col ...

  8. python编译 pyd 工具_avalon-fsn首页、文档和下载 - Python 编译构造工具 - OSCHINA - 中文开源技术交流社区...

    avalon-fsn avalon-fsn 是一个Python的编译构造工具,能够将你的代码Cython 使用avalon-fsn的好处 代码Cython化:Windows下把代码编译为pyd,Lin ...

  9. python汉化 草蟒_草蟒首页、文档和下载 - Python 汉化版 - OSCHINA - 中文开源技术交流社区...

    草蟒是基于 Python 的全中文编程语言. 示例 1: # 截至 n 的斐波那契数列 >>> 函 斐波那契数列(n): >>> a, b = 0, 1 >& ...

最新文章

  1. SOA在美国和中国的差异
  2. Linux_LVMQuota
  3. Gradle之FTP文件下载
  4. 【arduino】初测ESP32的DAC生成AV视频模拟信号项目:ESP32CompositeVideo
  5. C#委托(匿名函数)的各种变形写法
  6. mysql 远程用户授权_mysql创建远程用户并授权
  7. 51Nod-1049 最大子段和【DP】
  8. (附源码)springboot高校科研管理系统 毕业设计 222055
  9. Windows设置电脑每天自动重启
  10. SAP标准报表显示格式切换
  11. PS怎么用3D功能怎么用?如何用PS做立体字
  12. 产品需求边界确定的探索
  13. 推送原理解析 极光推送使用详解
  14. php自学建议_php自学提升进阶路线
  15. Java实现 蓝桥杯 基础练习 特殊的数字
  16. 基于java的社区志愿者服务系统
  17. SSH框架电力项目八--运行监控的保存
  18. 什么是上下变频器?以及对5G应用的作用
  19. SQLAlchemy学习教程
  20. 代码创建mdb数据库创建表

热门文章

  1. Knockout应用开发指南
  2. Linux中强制结束一个进程的终极方法和其他常用命令
  3. VOA Special English 简介
  4. uniapp七牛云上传图片or视频
  5. 国内最完美的sll远程连接工具-finalshell
  6. Qt5之布局管理之分割窗口、停靠窗口、堆栈窗口
  7. 将某班30名同学的C语言期末考试成绩,统计学期末考试试题(含答案)
  8. secureCRT使用的小问题
  9. 如何通过注册表的CLSID加载ITypeInfo
  10. AWR (Automatic Workload Repository)- 自动工作负载信息库