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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
python实现按任意键继续执行程序
Dec 30 Python
windows系统下Python环境的搭建(Aptana Studio)
Mar 06 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
基于Python列表解析(列表推导式)
Jun 23 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
关于Numpy中的行向量和列向量详解
Nov 30 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Python可变集合和不可变集合的构造方法大全
Dec 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
微信公众平台开发之天气预报功能
2015/08/31 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
麦鸡的TAB切换功能结合了javascript和css
2007/12/17 Javascript
动态添加js事件实现代码
2009/03/12 Javascript
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
Python 的 with 语句详解
2014/06/13 Python
Windows上使用virtualenv搭建Python+Flask开发环境
2016/06/07 Python
python3编码问题汇总
2016/09/06 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
python中count函数简单的实例讲解
2020/02/06 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
澳大利亚领先的宠物用品商店:VetSupply
2017/09/08 全球购物
教师自我鉴定范文
2013/11/10 职场文书
优秀教师事迹简介
2014/02/02 职场文书
六个一活动实施方案
2014/03/21 职场文书
环保倡议书怎么写
2014/05/16 职场文书
2014年大学生职业规划书:未来不是梦,只要勇敢冲!
2014/09/22 职场文书
小学四年级学生评语
2014/12/26 职场文书
2015年团支部工作总结
2015/04/03 职场文书
2019 入党申请书范文
2019/07/10 职场文书
nginx实现动静分离的方法示例
2021/11/07 Servers
windows系统安装配置nginx环境
2022/06/28 Servers