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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

solr 配置中文分词器

ik转载于:https://www.cnblogs.com/javabigdata/p/7127639.html

前端学习(2474):页面布局

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

https证书/即SSL数字证书申请途径和流程

国际CA机构GlobalSign中国 数字证书颁发中心网站&#xff1a;http://cn.globalsign.com      https证书即SSL数字证书&#xff0c;是广泛用 于网站通讯加密传输的解决方案&#xff0c;是提供通信保密的安全性协议&#xff0c;现已成为用来鉴别网站的真实身份&#xff0c;以…

linuxsed替换字符串后保存_Numpy运用-文件读写、存储及字符串处理

问题列举&#xff1a;Numpy文件读取Numpy文件存储Numpy字符串操作1、文件读取可以使用genfromtxt读取txt或者csv文件可以使用loadtxt读取txt或者csv文件两个函数功能类似&#xff0c;genfromtxt针对的更多是结构化数据注&#xff1a;delimiter表示的是以&#xff0c;分隔数据&a…

【转载记录】Accessing Device Drivers from C#

来源&#xff1a;http://www.drdobbs.com/cpp/accessing-device-drivers-from-c/184416423/Device Drivers are written largely in C or C. No explicit support for Device Driver communication is included in the current .NET framework. David implements support with …

mysql5.1win7_免安装版mysql5.1.57在win7下成功配置

mysql下载回来之后解压到D:/mysql-5.1.57-win32&#xff0c;把D:/mysql-5.1.57-win32/bin加入到系统环境变量Path中。然后需要简单的配置mysql数据库&#xff0c;把my-small.ini改名为my.ini(其他的几个文件也可以直接拿过来修改一下名字)&#xff0c;编辑文件my.ini&#xff0…

前端学习(2476):表单数据绑定处理

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

mysql列连接_连接来自MySQL中不同表的列

您可以使用CONCAT()。让我们首先创建一个表-mysql> create table DemoTable1-> (-> FirstName varchar(20)-> );使用插入命令在表中插入一些记录-mysql> insert into DemoTable1 values(Chris);mysql> insert into DemoTable1 values(David);使用select语句显…

sizeof小览

sizeof小览 一、文章来由—一道面试题迁出的探究 我发现我已经形成一种习惯写来由了&#xff0c;以后看博客的时候能够让我回顾起为什么出现这个问题&#xff0c;我用什么方法解决的&#xff0c;既然形成习惯就让这个习惯保持下去吧。今天实验室师姐在看书&#xff0c;一处不解…

前端学习(2477):封装数据接口

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

python读取一行数组_python 把文件中的每一行以数组的元素放入数组中的方法

有时候需要把文件中的数据放入到数组中&#xff0c;这里提供了一种方法&#xff0c;可以根据文件结尾的标记进行数据拆分&#xff0c;然后再把拆分的文件放入数组中# -*-coding: utf-8 -*-f open("username.txt","w")f.write("Lycoridiata\n")f…

前端学习(2478):请求提交

request.js <template> <div class"artical-container"><!--卡片--><el-card class"filter-card"><div slot"header" class"clearfix"><!--面包屑导航--><el-breadcrumb separator-class&quo…

java sql 结果_Java中的SQL结果集

您好我刚开始用Java编写Java(实际上也是不久前用Java开始的……)我创建了一个与MySQL数据库连接的类,它运行良好.现在我有一个问题来获得结果.在PHP中,我会做类似的事情While($row mysql_fetch_assoc()) {echo $row[rowname];}在Java中我尝试创建类似于此的东西,但我不知道我是…

贪心6--整数区间

贪心6--整数区间 一、心得 二、题目和分析 给n个区间&#xff0c;形式为[a, b]&#xff0c;a和b均为整数&#xff0c;且a < b。求一个最小的整数点的集合&#xff0c;使得每个区间至少2个不同的元素(整数点)属于这个集合。求这个集合的元素个数。输入第1行&#xff1a;1个整…

java栈API_Java中的堆栈API——Stack

标签&#xff1a;堆栈(stack)是线性表的一种&#xff0c;只能在该线性表的表尾进行插入、获取或删除的操作。该线性表具有LIFO(后进先出)的特点&#xff0c;那么Java中如何实现这一功能呢&#xff0c;呵呵呵&#xff0c;Java已经为我们提供了API——Stack&#xff0c;Stack类继…

分治3--黑白棋子的移动

分治3--黑白棋子的移动 一、心得 二、题目和分析 黑白棋子的移动&#xff08;chessman&#xff09;【问题描述】有2n个棋子&#xff08;n≥4&#xff09;排成一行&#xff0c;开始位置为白子全部在左边&#xff0c;黑子全部在右边&#xff0c;如下图为n5的情形&#xff1a;○○…