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的Django框架中从url中捕捉文本的方法
Jul 20 Python
python select.select模块通信全过程解析
Sep 20 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 Python
python检测服务器端口代码实例
Aug 31 Python
matplotlib绘制多个子图(subplot)的方法
Dec 03 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
python中图像通道分离与合并实例
Jan 17 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
Mar 19 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
python析构函数用法及注意事项
Jun 22 Python
Python图片验证码降噪和8邻域降噪
Aug 30 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
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
php实现socket推送技术的示例
2017/12/20 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
jQuery UI Autocomplete 1.8.16 中文输入修正代码
2012/04/16 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
在JavaScript的正则表达式中使用exec()方法
2015/06/16 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
js前端面试题及答案整理(一)
2016/08/26 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
vue生命周期与钩子函数简单示例
2019/03/13 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python线程中对join方法的运用的教程
2015/04/09 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
2015/05/21 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
EJB面试题
2015/07/28 面试题
班组长安全职责
2014/01/05 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
欢迎新生标语
2014/10/06 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
医者仁心观后感
2015/06/17 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
Django框架之路由用法
2022/06/10 Python