本文为转载摘要,完整版请移步:

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 = "world";

let n = 5;

python! {

for i in range('n):

print(i, "Hello", 'who)

print("Goodbye")

}

}

它允许你将Python代码直接嵌入Rust代码行之间,甚至直接在Python代码中使用Rust变量。

我们将从一个比这个简单得多的案例开始,然后逐步努力以达到这个结果(甚至更多!)。

-2-

运行Python代码

首先,让我们看一下如何在Rust中运行Python代码。让我们尝试使第一个简单的示例生效:

fn main(){

println!("Hello ...");

run_python("print(\"... World!\")");

}

我们可以使用std::process::命令来运行python可执行文件并传递python代码,从而实现run_python,但如果我们希望能够定义和读回Python变量,那么最好从使用PyO3库开始。

PyO3为我们提供了Python的Rust绑定。它很好地包装了Python C API,使我们可以直接在Rust中与各种Python对象交互。(甚至在Rust中编写Python库,但这是另一个主题。)

它的Python::run功能完全符合我们的需求。它将Python代码作为&str,并允许我们使用两个可选的PyDicts 来定义范围内的任何变量。让我们试一试吧:

fn run_python(code: &str) {

let py = pyo3::Python::acquire_gil(); // Acquire the 'global interpreter lock', as Python is not thread-safe.

py.python().run(code, None, None).unwrap(); // No locals, no globals.

}

$ cargo run

Compiling scratchpad v0.1.0

Finished dev [unoptimized + debuginfo] target(s) in 0.29s

Running `target/debug/scratchpad`

Hello ...

... World!

看,这就成功了!

-3-

基于规则的宏

在字符串中编写Python不是最便捷的方法,所以我们尝试改进它。宏允许我们在Rust中自定义语法,所以让我们尝试一下:

fn main() {

println!("Hello ...");

python! {

print("... World!")

}

}

宏通常是使用macro_rules!进行定义,您可以基于标记和表达式之类的内容使用高级“查找和替换”规则来定义宏。(有关macro_rules!的介绍请参见Rust Book中有关宏的章节,有关Rust宏所有的细节都可以在《Rust宏的小书》中找到。)

完整版请移步:https://mp.weixin.qq.com/s/YT_HNFDCQ_IyocvBkRNJnA

python调用rust_在 Rust 代码中编写 Python 是种怎样的体验?相关推荐

  1. 我们编写的python代码在运行过程中_在Rust代码中编写Python是种怎样的体验?

    原标题:在Rust代码中编写Python是种怎样的体验? 作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前 ...

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

    作者 | Mara Bos,Rust资深工程师 译者 | Arvin,编辑 | 屠敏 来源 | CSDN(ID:CSDNnews) 大约一年前,我发布了一个名为inline-python(https: ...

  3. c++hello world代码_在 Rust 代码中编写 Python 是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师译者 | Arvin 责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews) 以下为译文: 大约一年前,我发布了一 ...

  4. c++hello world代码_在Rust代码中编写Python是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师译者 | Arvin,编辑 | 屠敏来源 | CSDN(ID:CSDNnews)大约一年前,我发布了一个名为inline-python(https://c ...

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

    作者 | Mara Bos,Rust资深工程师 译者 | Arvin 责编 | 屠敏 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 大约一年前,我发 ...

  6. Python调用OpenStack API 《通过RESTful编写Python运维》

    目录 Python调用OpenStack API   <通过RESTful编写Python运维> 赛题实施 1. 认证服务:用户管理 (1&#x

  7. Maya Python 第三章 在Maya 中编写python程序

    3.2 Maya 命令 import maya.cmds as cmdssphere = cmds.polySphere() cmds.polySphere(sphere[1],edit=True,r ...

  8. android studio调用python,Android studio中编写Python代码-2

    Chaquopy 教程 Chaquopy Chaquopy的作用:使用Chaquopy在Android Studio添加Python环境,java和Python互调 目前调试后APP可以正常运行(20 ...

  9. python调用rust_转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一些性能问题,不过 Sentry 工程师分享的在关键模块上用另外一门语言 Rust 来代替 Python 的情况还是比较罕见,也在 ...

最新文章

  1. WF单元测试系列3:测试Activity的行为
  2. jsp中setAttribute与getAttribute方法使用介绍
  3. MyDAL - .IsExistAsync() 使用
  4. Math工具类常用API使用案例
  5. 原生js实现JSON.parse()和JSON.stringify()
  6. python之socket编程
  7. oracle中showTime用法,ant design vue中日期选择框混合时间选择器的用法
  8. Xcode6中Swift没有智能提示和自动补全功能
  9. Python 标准库 csv —— csv 文件的读写
  10. windos读写ext3工具_Windows读写Ext3文件系统
  11. 使用OpManager监控AIX
  12. knife4j文档-个人笔记
  13. 全国计算机等级考试 三级网络技术 知识点总结
  14. 有哪些比较好用的黄页网站?
  15. 奔波霸儿大战邮箱服务器
  16. 需求工程-学习通习题-太原理工大学(14-17章)
  17. UAP开发中遇到的问题
  18. golang办公工作流workflow js-ojus/flow包介绍——系列一
  19. [TJOI2013]松鼠聚会
  20. HTML制作简单交互网页

热门文章

  1. SAP UI5 web Component里的条件渲染机制
  2. oModel.create will also send to backend directly
  3. SAP Marketing Cloud功能简述(三) 营销活动内容设计和产品推荐
  4. why SAP CRM My Opportunity Master page must be renamed as S2
  5. SAP Fiori My note应用的add to功能的后台ABAP实现
  6. SAP Fiori :why my filter for category does not work
  7. OData model instance initialization will trigger metadata load from backend
  8. view controller lifecycle discussion - beforeRendering
  9. how to avoid transport error when cloning project in Eclipse
  10. where is application controller bound to application main view