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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
对于Python的框架中一些会话程序的管理
Apr 20 Python
Python中列表的一些基本操作知识汇总
May 20 Python
Python生成随机验证码的两种方法
Dec 22 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
分享Python切分字符串的一个不错方法
Dec 14 Python
Python 控制终端输出文字的实例
Jul 12 Python
python各类经纬度转换的实例代码
Aug 08 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
Python 使用生成器代替线程的方法
Aug 04 Python
python 实现的截屏工具
May 08 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动态生成虚拟现实VRML网页
2006/10/09 PHP
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
js 屏蔽鼠标右键脚本附破解方法
2009/12/03 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
js实现拖拽效果
2015/02/12 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
微信小程序module.exports模块化操作实例浅析
2018/12/20 Javascript
vue如何实现动态加载脚本
2020/02/05 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
使用Python监控文件内容变化代码实例
2018/06/04 Python
python网络应用开发知识点浅析
2019/05/28 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
中科软测试工程师面试题
2012/06/16 面试题
儿子婚宴答谢词
2014/01/09 职场文书
回门宴父母答谢词
2014/01/26 职场文书
花坛标语大全
2014/06/30 职场文书
教师个人读书活动总结
2014/07/08 职场文书
借名购房协议书范本
2014/10/06 职场文书
新闻人物通讯稿
2014/10/09 职场文书
欠条格式范本
2015/07/03 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
pytorch中的 .view()函数的用法介绍
2022/03/17 Python
Python利用FlashText算法实现替换字符串
2022/03/31 Python
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript