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创建和删除目录的方法
Apr 29 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
django缓存配置的几种方法详解
Jul 16 Python
Python的条件表达式和lambda表达式实例
Jan 31 Python
由面试题加深对Django的认识理解
Jul 19 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
python推导式的使用方法实例
Feb 28 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
多人战的战术与战略
2020/03/04 星际争霸
摩卡咖啡
2021/03/03 咖啡文化
php一些公用函数的集合
2008/03/27 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
javascript中toFixed()四舍五入使用方法详解
2018/09/28 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
Python中使用pprint函数进行格式化输出的教程
2015/04/07 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
Python学习教程之常用的内置函数大全
2017/07/14 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python实现的knn算法示例
2018/06/14 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Pytorch中的VGG实现修改最后一层FC
2020/01/15 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
函授自我鉴定
2013/11/06 职场文书
教师求职信
2014/06/17 职场文书
大学活动总结模板
2014/07/10 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
2014年社区计生工作总结
2014/11/18 职场文书
违纪检讨书范文
2015/01/27 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS