Python3.X使用Cython调用C/C++
1 创建C++代码
假设我们需要让Python调用的C++代码如下(文件名为demo.h
):
#ifndef DEMO_H
#define DEMO_H
using namespace std;
namespace demo {class MyDemo {public:int a;MyDemo();MyDemo(int a );~MyDemo(); int mul(int m );int add(int b);void sayHello(char* name);};
}
#endif
对应的C++实现代码如下(demo.cpp
):
#include "demo.h"
#include <iostream> namespace demo {MyDemo::MyDemo () {}MyDemo::MyDemo (int a) {this->a = a; }MyDemo::~MyDemo () {}int MyDemo::mul(int m) {return this->a*m;}int MyDemo::add (int b) {return this->a+b;}void MyDemo::sayHello(char* name){cout<<"hello "<<name<<"!"<<endl;}}
2 编写pxd
文件
pxd
文件可以看成是Cython
(即pyx
文件)的头文件,关于pxd
和pyx
文件可以简单如下来理解:
pxd
文件是pyx
与C/C++
之间的桥梁。
pyx
是C/C++
与Python
之间的桥梁。
既然pxd
是头文件,那就是跟demo.h
长的很像,创建cdemo.pxd
文件,内容如下。
cdef extern from "demo.cpp":pass# Decalre the class with cdef
cdef extern from "demo.h" namespace "demo":cdef cppclass MyDemo:MyDemo() except +MyDemo(int) except +int aint mul(int )int add(int )void sayHello(char*)
3 编写pyx
文件
前面说过,pyx
文件是C/C++
与Python
之间的桥梁,也就是pyx
文件会将C/C++
代码做一层包装,方便Python直接调用,创建adapter.pyx
文件,代码如下。
# distutils: language = c++from cdemo cimport MyDemo# Create a Cython extension type which holds a C++ instance
# as an attribute and create a bunch of forwarding methods
# Python extension type.
cdef class PyMyDemo:cdef MyDemo c_mydemo # Hold a C++ instance which we're wrappingdef __cinit__(self,a):self.c_mydemo = MyDemo(a) def mul(self, m):return self.c_mydemo.mul(m)def add(self,b):return self.c_mydemo.add(b)def sayHello(self,name ):self.c_mydemo.sayHello(name)
其中,第一行# distutils: language = c++
会指定当前文件生成C++
文件。创建PyMyDemo类用于将C/C++
代码做一层封装,使得Python能直接调用。
4 创建setup.py
文件
setup.py
文件相对比较简单,代码如下。
from distutils.core import setupfrom Cython.Build import cythonizesetup(ext_modules=cythonize("adapter.pyx"))
5 执行编译
在控制台输入如下命令:
python setup.py build_ext --inplace
执行命令后,在当前目录会生成adapter.cpp
,这个文件是根据adapter.pyx
生成的。同时还会生成adapter.cp36-win_amd64.pyd
文件(Linux
环境下对应so
文件)。 这里的pyd
文件是windows平台对应文件,这就是我们需要的文件。
6 测试
测试结果如下
>>> from adapter import PyMyDemo
>>> demo=PyMyDemo(2)
>>> demo.add(1)
3
>>> demo.mul(2)
4
>>> demo.sayHello(b'HuaChao')
hello HuaChao!
Python3.X使用Cython调用C/C++相关推荐
- Python3.5 函数的调用
Python3.5 函数的调用 望共同进步 转载请注明地址:http://blog.csdn.net/weixin_39701039/article/details/79567006 在 函数的定义: ...
- python导入pyx文件出错,pyx文件 生成pyd 文件用于 cython调用的实现
pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行.我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,"语法错误" ...
- python导入pyx文件_pyx文件 生成pyd 文件用于 cython调用
转于:https://www.2cto.com/kf/201405/304168.html 1. 初衷 最近学用python,python不愧是为程序员考虑的编程语言,写起来很快很方便,大大节省开发效 ...
- c语言的pyx文件什么作用,pyx文件 生成pyd 文件用于 cython调用的实现
pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行.我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,"语法错误" ...
- python3 协程asyncio 调用步骤、阻塞和await、task任务、future对象 partial
首先介绍一下 偏函数 如果需要减少某个函数的参数个数,你可以使用 functools.partial() [作用一]:partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参 ...
- pyx文件 生成pyd 文件用于 cython调用
参考: http://www.2cto.com/kf/201405/304168.html 参考: http://blog.csdn.net/darren2015zdc/article/details ...
- python3 推荐使用super调用base类方法
from:https://python3-cookbook.readthedocs.io/zh_CN/latest/c08/p07_calling_method_on_parent_class.htm ...
- python3 zip命令_Python调用zip命令正确操作方法解析
当我们在应用Python编程语言进行程序开发的时候,我们会发现这一语言可以帮助我们轻松的完成一些特定的功能需求.在这里我们就先一起来了解一下Python调用zip命令的使用方法,以此了解这一语言的操作 ...
- python3 安卓_Android QPython3 调用 其他 Android App
需要android.py 可视化还需要: BaseWindow.py MultText.py MltiText.py Output.py [AndroidManifest.xml] package=& ...
最新文章
- python常用命令汇总-Python爬虫框架Scrapy常用命令总结
- 不动产登记进入倒计时 哪些房子必须要卖掉?
- MyBatis学习总结(七)——Mybatis缓存
- 【若依(ruoyi)】自定义layer
- 仿英雄联盟比赛直播网页模板
- 7月20日专家在线访谈“员工上网管理是否可行”
- EasyRecovery15中文版专业数据恢复软件
- 91手机助手官网iPhone版 v5.6.1 官方版
- 皮尔森 统计学相关性分析_【R语言】读懂Pearson相关分析结果
- Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes解决办法
- colorbox ajax,Colorbox弹出层插件
- 正则表达式行尾行首添加字符
- [CEOI2017]One-Way Streets
- 5分钟实现微信小程序绘制二维码
- 基于二阶盲源分离方法执行模态识别研究(Matlab代码实现)
- symfony 分表 查询 调用
- moore 数据集_【数据集】一文道尽医学图像数据集与竞赛
- ElasticSearch学习之Kibana(一)
- 专题10:如何应对面试官的拷问—你了解python的装饰器吗?
- postgresql索引_PostgreSQL中的索引— 8(RUM)
热门文章
- 网格设计版式设计_编辑版式,排除项和CSS网格
- golang 将kafka的offset置为最新
- 遇到的问题--docker---gitlab---k8s---error pulling image configuration: Get https://production.cloudflare.
- Linux-Logs 查看日志文件
- 垂直网站之路:金融风暴加速向电子商务转型
- [ICCV2021]Learning to Stylize Novel Views
- nginx自定义404错误页面
- 服务器基本搭建(Linux系统阿里云服务器为例)-购买云服务器
- 每天五分钟机器学习:如何计算模型的假阳性率和真阳性率?
- 来自北京大学NOIP金牌选手yxc的常用代码模板1——基础算法