编写Python扩展

chatgpt赋能pythonPythonList扩充方法与使用技巧 本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。 阅读详情

使用SWIG实现C++扩展Python

link:http://blog.csdn.net/panbinfeng/archive/2006/04/14/662563.aspx

1. 直接C扩展Python的方法
Python的扩展API是主要为C语言提供的,可以利用该API为要导出的C函数建立包装器(wrapper)。包装器用来处理Python对象与底层C函数中的变量与所需值之间的转换,并将C函数注册到Python的自定义module中。
假设将要导出的函数成为模块函数,对应wrapper中的函数为包装函数。则wrapper文件主要包含以下几个部分:
include "Python.h";
每个模块函数的包装函数,即:PyObject* Module_func();
每个模块函数的函数定义,即:PyMethodDef ModuleMethods[]对应表;
模块的初始化函数:void initModule()部分。
简单示例程序:

2. 怎样用SWIG生成C的wraper
SWIG是一个自动的扩展构造工具。它读入注释的源程序头文件(后缀为.i的脚本文件),为python、tcl、perl等多种脚本语言产生wrap代码。
步骤大致为:
(1) 写源程序;
(2) 写后缀为.i的脚本文件;
(3) 使用命令"swig -python example.i"生成example_wrap.c,example_wrap.doc;
(4) 编译连接成共享库。
脚本文件的格式很简单,只需要列出要导出的函数或类型,并注释必要信息。还以上面的example.c为例

接下来就可以在Python环境中使用example模块中的函数了。

3. 用SWIG生成C++的wraper
用SWIG生成C++的wrapper过程类似于C wrapper。它的步骤如下:
(1) 写.cpp源程序;
(2) 写.i脚本文件;
(3) swig -c++ -python foo.i
生成foo_wrap.c,foo_wrap.doc;
(4) 编译连接成共享库foo.so。
则生成Python的foo模块,可以通过调入foo模块使用其中的类成员函数、成员变量。
简单示例:

注:这里使用的SWIG版本为:swig-1.3.24。

 

使用Boost.Python扩展和嵌入Python - 征服Python,语言基础与典型应用

Link: http://book.51cto.com/art/200710/58100.htm

8.4.2  使用Boost.Python扩展和嵌入Python

通过Boost.Python可以在Python内使用C++类和函数。和SWIG一样Boost.Python简化了编写Python扩展的代码,而不用使用Python/C API。但与SWIG不同,Boost.Python是一个类库,无需再使用接口文件。

1.初始化和方法列表
在Boost.Python中可以通过使用BOOST_PYTHON_MODULE来命名模块名。在BOOST_PYTHON_MODULE中则可以使用def来实现使用Python/C API定义的方法列表。以下是一个简单的例子。

2.导出类
通过Boost.Python可以将在C++中定义的类及其方法、属性等导入Python中。以下程序在C++中定义一个Message类,然后通过BOOST_PYTHON_MODULE将其导入Python中。

以下代码在Python中使用编译好的Message模块。

3.类的成员属性
在C++中类的成员可以使用关键字声明为不同的属性。而在Python中则依靠类属性的命名方式。使用Boost.Python可以将其C++中类成员的属性传递给Python。如下所示代码使用Boost.Python来处理类成员的属性。将BOOST_PYTHON_MODULE中的代码改为如下所示。

此处将Message类中的成员msg设置为可读写,还可以使用“.def_readonly”将其设置为只读属性。对于类中的私有成员还可以使用 “.add_property”将其操作函数设置为Python类中的属性。如下代码使用“.add_property”对私有成员进行操作。

以下代码在Python中使用编译好的Message模块。

4.类的继承
C++中类的继承关系也可以通过Boost.Python反映到Python模块中。以下代码将父类和子类分别导入到Python模块中。

5.运算符重载
在Python中运算符重载实际是类专有方法的重载。在C++中对运算符重载后,通过Boost.Python可以传递给Python。如下代码将Msg类的“+”运算符重载,然后通过“.def(self + self)”传递给Python。

对于其他的运算符重载也可以使用同样的方法,如下所示。

6.使用Boost.Python在C++中嵌入Python
在C++中嵌入Python的主要问题是 C++与Python之间的数据类型的转换。Boost.Python对Python/C API进行封装,可以使用类似于Python的方式对数据进行声明、操作等。在Boost.Python中使用Object类封装了Python/C API中的 PyObject*。Boost.Python定义了与Python中列表、字典等对应的类,如表8-2所示。

表Boost.Python与Python中部分类的对应关系

 

Boost.Python

Python

list

列表

dict

字典

tuple

元组

str

字符串

 

Boost.Python提供了Python中对象的操作方法。如str类具有lower、split、title、upper等方法。而list类则具有append、count、extend等方法。以下代码使用Boost.Python在C++中嵌入Python。

 

如何用Python为Audacity编写扩展脚本 Audacity官方网站的资料非常丰富和杂乱。 阅读详情

相关推荐

使用C++编写Python扩展

使用扩展的方式调用 C++ 函数,更容易防止两种程序空间使用出现冲突。

To learn, to engage. 4361

C++调用python,并抓取每日一句名言

什么是语言融合?一起来看一看如何利用C++调用python实现爬虫吧!

你的问题在于,读书太少而想得太多。 592

C++实现Python变量

C++实现Python变量         仔细想想,其实所有分配在栈和静态存储区的存储空间都是由一个变量来标识,这是由系统自己管理的内存空间,而堆上分配的空间在每次运行期都是不一样的,也就是不是编译期决定的,所以只能用指针来标识。那么我们是否可以将这种指针标识的内存空间标量化,对象化呢?其实是可以的,事实上python就是这么做的。通过采用引用计数的方式来管理这段内存。我们现在要来实现这样

liaoyoujinb的专栏 1718

Python中list列表的扩展方式和dict的用法

list扩展方式,dictionary的使用方法

weixin_64662394的博客 2418

Python列表的扩展

颠倒排序reverse(),reverse()方法时用来把一个列表进行颠倒过来 sort()排序,sort()方法可以对列表元素从小到大排序,这个方法同时对纯数值元素与纯英文字符串元素有非常好的效果,需要注意的是,经排序后原列表的元素顺序会被永久更改。Python有内置一些执行统计运算的函数,如果列表内容都是数值的时候可以使用max()函数获取列表中的最大值,min()函数可以获取列表中的最小值,sum()函数可以获取列表的总和。列表的相加使用加号(+)进行,相当于把列表进行拼接或者结合到一起。

weixin_47410460的博客 291

用Rust编写Python扩展

Rust是一种内存安全的语言,它提供了与C语言类似的底层访问能力,但具有更强大的内存安全和并发特性。:一旦你编译了Rust代码并生成了共享库,你就可以在Python中像导入任何其他模块一样导入它,并调用你在Rust中定义的函数。通过这种方式,你可以利用Rust的强大功能和性能优势来扩展Python,同时享受到Python的易用性和丰富的生态系统。:你可以使用Cargo来构建你的Rust代码,并生成一个Python可以导入的共享库(例如。:首先,你需要在你的系统上安装Rust。,它会自动处理大部分构建配置。

程序猿视角 1654

Python 扩展Python(编写Python 扩展)

Python 编写扩展主要涉及三个步骤。1.创建应用代码。2.根据样板编写封装代码。3.编译并测试。本节将深入了解这三个步骤。

钢铁男儿 619

用c语言编写python扩展,扩展python 用C语言编写python扩展代码

环境:centos7一、首先简单的说明下什么情况下需要扩展python1.需要python没有的额外功能时。2.改善瓶颈性能。中所周知,由于解释型语言的代码在运行时即时转换,因此执行起来比编译语言慢。3.隐藏专有代码。二、编写python扩展主要涉及的三个步骤1.创建应用代码(一定要保证应用代码的准确性)2.根据样板编写封装代码样板代码主要含有四个部分:(1)包含python头文件(一定要安装py...

weixin_39629679的博客 645

编写 blender python 扩展 (extension / addon)

本文编写了一个简单的 blender python 扩展, 实现了持续旋转物体的功能.blender python 扩展编写简单方便, 可以用于制作小工具, 提高效率. 也能用于结合别的软件系统, 总之, 发挥和想像的空间很大!本文使用 CC-BY-SA 4.0 许可发布.

穷人小水滴的博客 1090

Python高级编程——编写扩展

Python扩展三种不同的实现方式: 一、编写纯C扩展。 写过JNI的人很容易理解,纯C扩展就是利用Python/C API来扩展python应用。C/API的详细使用,请参见:https://docs.python.org/3.6/c-api/ 例子: """setup.py文件:用来告诉解释器我们的扩展是如何编译的 扩展的构建过程可以通过Python的setup.py构建...

kieven2008的专栏 736

C++学习日记:编写一个Python扩展

环境:windows+msvc+xmake+vscode。下新建test.py文件,编写

m0_52111823的博客 525

用C语言编写Python扩展模块

http://blog.tianya.cn/blogger/post_read.asp?BlogID=3616841&PostID=36654684 作为脚本语言,Python也有执行效率不高的缺点,不过可以用Python写框架,用C去实现具体的功能,一方面兼顾了运行效率,另一方面也提高了开发速度。闲话少说,下面介绍一下如何用C编写Python扩展模块。     编写扩展分为两个部分

入凡尘笔录 2520

编写Python的C扩展

最近做性能压测,接口都是文件协议,需要用Python生成大数据量的交易文件,涉及到一个生成11位不重复的账号,考虑用系统毫秒数加序列来生成,但是光系统毫秒数都已经13位了,位数不够用,想到可以用62进制来压缩位数,结果用Python的写法,调用1000W次,需要68秒,就想到了可以用C来进行扩展。 首先在Clion中新建一个C Library ,type选shared,standard选C99 ...

ruancan的专栏 611

深入探索 GDB 的 Python 扩展python-gdb.py 编写、获取与使用

GDB(GNU Debugger)是一款强大的调试工具,而 Python 扩展为其带来了更灵活的自定义功能,允许开发者通过 Python 代码扩展 GDB 的行为。本文将详细介绍如何编写扩展脚本,以及从哪些途径获取这些扩展,同时还会讲解如何使用这些扩展来提升调试效率。目录简介一、Python 扩展对 GDB 的作用二、编写 python-gdb.py 扩展脚本2.1 了解 GDB 的 Python API2.2 编写示例脚本示例 1:打印当前调试程序的进程 ID示例 2:打印当前线程的 ID。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 1781

编写python扩展模块_使用C++编写Python扩展

Python的很多库中都包含了C/C++的代码,在安装这种库的时候,尝尝会遇到这样的报错:error: unable to find vcvarsall.bat通常的解决方案有两种:安装visual studio或者mingw;使用编译好的Python库文件,进行安装。一般大家都会选择安装编译过的库文件,或者安装mingw,但是如果要在Windows下为自己的Python程序编写扩展,安装visu...

weixin_39918145的博客 344

Python随笔】用C++编写Python扩展模块

近期笔者在研究python内部部分模块的实现机理,研究着研究着就开始硬刚C源码了。想着先前工作或是日常也没有体验过用C++编写python库,于是就刚好学习了一下。 用C或者C++编写python扩展库,建议用Visual Studio宇宙第一IDE,一来能够同时支持python跟C,二来调试功能非常强大。入门上手的话,可以参考下面的文档: 官网文档:扩展和嵌入 Python 解释器 VS文档:Create a C++ extension for Python 编写的库叫做cplayground,只包

HiKariのTechLab 696

编写Python3的C扩展

为何要编写C扩展 保护核心代码 解决性能瓶颈 创建C一些特有的东西 环境: Linux .13.9-300.fc27.x86_64 Python 3.6.3 开始 目标 这次我么来实习制作Python3的扩展,实现两个功能: 求一个整数的绝对值 求一个字符串的逆序 用c实现这个功能: int my_abs(int n){ if(n<0) ...

李余通的博客 3979

扩展python 用C语言编写python扩展代码

环境:centos7 一、首先简单的说明下什么情况下需要扩展python 1.需要python没有的额外功能时。 2.改善瓶颈性能。中所周知,由于解释型语言的代码在运行时即时转换,因此执行起来比编译语言慢。 3.隐藏专有代码。 二、编写python扩展主要涉及的三个步骤 1.创建应用代码(一定要保证应用代码的准确性) 2.根据样板编写封装代码   样板代码主要含有四个部分:

rookie liang的博客 1360
上一篇: 委托,事件,动态代理,函数指针
下一篇: Multiple IE 与 IETester, 集成版IE浏览器
Rogues
博客等级 码龄19年 9粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值