Python嵌入C/C++进行开发详解


Posted in Python onJune 09, 2020

如果你想把Python嵌入C/C++中是比较简单的事情,你需要的是在VC中添加Python的include文件目录和lib文件目录。下面我们来看下如何把Python嵌入C/C++中。

VC6.0下,打开 tools->options->directories->show directories for,将Python安装目录下的inlude目录添加到inlude files项中,将libs目录添加到library files项中。

VC2005下,打开tools->options->项目和解决方案->VC++目录,然后做相同工作。

代码如下:

在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成

#include <python.h> 
int main() 
{ 
Py_Initialize(); 
PyRun_SimpleString("Print 'hi, python!'"); 
Py_Finalize(); 
return 0; 
}

Py_Initialize函数原型是:void Py_Initialize()

把Python嵌入C/C++中时必须使用该函数,它初始化Python解释器,在使用其他的Python/C API之前必须先调用该函数。可以使用Py_IsInitialized函数判断是否初始化成功,成功返回True。

PyRun_SimpleString函数原型是int PyRun_SimpleString(const char *command),用来执行一段Python代码。

注意:是否需要维持语句间的缩进呢?

Py_Finalize函数原型是void Py_Finalize(),用于关闭Python解释器,释放解释器所占用的资源。

PyRun_SimpleFile函数可以用来运行".py"脚本文件,函数原型如下:

int PyRun_SimpleFile(FILE *fp, const char *filename);

其 中fp是打开的文件指针,filename是要运行的python脚本文件名。但是由于该函数官方发布的是由visual studio 2003.NET编译的,如果使用其他版本的编译器,FILE定义可能由于版本原因导致崩溃。同时,为简便起见可以使用如下方式来代替该函数:

PyRun_SimpleString("execfile(‘file.py')"); //使用execfile来运行python文件

Py_BuildValue()用于对数字和字符串进行转换处理,变成Python中相应的数据类型(在C语言中,所有Python类型都被声明为PyObject类型),函数原型如下:

PyObject *Py_BuildValue(const char *format, …..);

PyString_String()用于将PyObject*类型的变量转换成C语言可以处理的char*型,具体原型如下:

char* PyString_String(PyObject *p)。

知识点扩展:

Python调用C/C++ DLL动态链接库的方法

首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件:

//hello.h
#ifdef EXPORT_HELLO_DLL
#define HELLO_API __declspec(dllexport)
#else
#define HELLO_API __declspec(dllimport)
#endif
extern "C"
{
 HELLO_API int IntAdd(int , int);
}

CPP文件:

//hello.cpp
#define EXPORT_HELLO_DLL
#include "hello.h"
HELLO_API int IntAdd(int a, int b)
{
 return a + b;
}

这里有两个注意点:

(1)弄清楚编译的时候函数的调用约定采用的__cdecl还是__stdcall,因为根据DLL中函数调用约定方式,Python将使用相应的函数加载DLL。

(2)如果采用C++的工程,那么导出的接口需要extern "C",这样python中才能识别导出的函数。

到此这篇关于Python嵌入C/C++进行开发详解的文章就介绍到这了,更多相关Python如何嵌入C/C++进行开发内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅谈Python浅拷贝、深拷贝及引用机制
Dec 15 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
python Opencv将图片转为字符画
Feb 19 Python
python的pandas工具包,保存.csv文件时不要表头的实例
Jun 14 Python
python 把列表转化为字符串的方法
Oct 23 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
PHP统计代码行数的小代码
Sep 19 Python
PyTorch 对应点相乘、矩阵相乘实例
Dec 27 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
python制作图形界面的2048游戏, 基于tkinter
Apr 06 Python
Keras load_model 导入错误的解决方式
Jun 09 #Python
如何用python处理excel表格
Jun 09 #Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 #Python
Python使用Chrome插件实现爬虫过程图解
Jun 09 #Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 #Python
Python带参数的装饰器运行原理解析
Jun 09 #Python
Python sorted对list和dict排序
Jun 09 #Python
You might like
php 页面执行时间计算代码
2008/12/04 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
javascript 简练的几个函数
2009/08/29 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
js定时器实例分享
2016/12/20 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
AngularJS中filter的使用实例详解
2017/08/25 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
vue el-table实现行内编辑功能
2019/12/11 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[00:59]DOTA2背景故事第二期之四大基本法则
2020/07/07 DOTA
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
打架检讨书500字
2014/01/29 职场文书
统计系教授推荐信
2014/02/28 职场文书
法人授权委托书格式
2014/04/08 职场文书
仓库管理计划书
2014/05/04 职场文书
监督检查工作方案
2014/05/28 职场文书
个人投资合作协议书
2014/10/12 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
运动与健康自我评价
2015/03/09 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android