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文件)的头文件,关于pxdpyx文件可以简单如下来理解:

pxd文件是pyxC/C++之间的桥梁。
pyxC/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++相关推荐

  1. Python3.5 函数的调用

    Python3.5 函数的调用 望共同进步 转载请注明地址:http://blog.csdn.net/weixin_39701039/article/details/79567006 在 函数的定义: ...

  2. python导入pyx文件出错,pyx文件 生成pyd 文件用于 cython调用的实现

    pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行.我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,"语法错误" ...

  3. python导入pyx文件_pyx文件 生成pyd 文件用于 cython调用

    转于:https://www.2cto.com/kf/201405/304168.html 1. 初衷 最近学用python,python不愧是为程序员考虑的编程语言,写起来很快很方便,大大节省开发效 ...

  4. c语言的pyx文件什么作用,pyx文件 生成pyd 文件用于 cython调用的实现

    pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行.我在eric4上写的,结果它默认用python解释器来进行解释,还提示有bug,"语法错误" ...

  5. python3 协程asyncio 调用步骤、阻塞和await、task任务、future对象 partial

    首先介绍一下 偏函数 如果需要减少某个函数的参数个数,你可以使用 functools.partial() [作用一]:partial() 函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参 ...

  6. pyx文件 生成pyd 文件用于 cython调用

    参考: http://www.2cto.com/kf/201405/304168.html 参考: http://blog.csdn.net/darren2015zdc/article/details ...

  7. python3 推荐使用super调用base类方法

    from:https://python3-cookbook.readthedocs.io/zh_CN/latest/c08/p07_calling_method_on_parent_class.htm ...

  8. python3 zip命令_Python调用zip命令正确操作方法解析

    当我们在应用Python编程语言进行程序开发的时候,我们会发现这一语言可以帮助我们轻松的完成一些特定的功能需求.在这里我们就先一起来了解一下Python调用zip命令的使用方法,以此了解这一语言的操作 ...

  9. python3 安卓_Android QPython3 调用 其他 Android App

    需要android.py 可视化还需要: BaseWindow.py MultText.py MltiText.py Output.py [AndroidManifest.xml] package=& ...

最新文章

  1. python常用命令汇总-Python爬虫框架Scrapy常用命令总结
  2. 不动产登记进入倒计时 哪些房子必须要卖掉?
  3. MyBatis学习总结(七)——Mybatis缓存
  4. 【若依(ruoyi)】自定义layer
  5. 仿英雄联盟比赛直播网页模板
  6. 7月20日专家在线访谈“员工上网管理是否可行”
  7. EasyRecovery15中文版专业数据恢复软件
  8. 91手机助手官网iPhone版 v5.6.1 官方版
  9. 皮尔森 统计学相关性分析_【R语言】读懂Pearson相关分析结果
  10. Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes解决办法
  11. colorbox ajax,Colorbox弹出层插件
  12. 正则表达式行尾行首添加字符
  13. [CEOI2017]One-Way Streets
  14. 5分钟实现微信小程序绘制二维码
  15. 基于二阶盲源分离方法执行模态识别研究(Matlab代码实现)
  16. symfony 分表 查询 调用
  17. moore 数据集_【数据集】一文道尽医学图像数据集与竞赛
  18. ElasticSearch学习之Kibana(一)
  19. 专题10:如何应对面试官的拷问—你了解python的装饰器吗?
  20. postgresql索引_PostgreSQL中的索引— 8(RUM)

热门文章

  1. 网格设计版式设计_编辑版式,排除项和CSS网格
  2. golang 将kafka的offset置为最新
  3. 遇到的问题--docker---gitlab---k8s---error pulling image configuration: Get https://production.cloudflare.
  4. Linux-Logs 查看日志文件
  5. 垂直网站之路:金融风暴加速向电子商务转型
  6. [ICCV2021]Learning to Stylize Novel Views
  7. nginx自定义404错误页面
  8. 服务器基本搭建(Linux系统阿里云服务器为例)-购买云服务器
  9. 每天五分钟机器学习:如何计算模型的假阳性率和真阳性率?
  10. 来自北京大学NOIP金牌选手yxc的常用代码模板1——基础算法