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 相关文章推荐
仅利用30行Python代码来展示X算法
Apr 01 Python
用Python的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
浅谈python编译pyc工程--导包问题解决
Mar 20 Python
详解Python函数式编程—高阶函数
Mar 29 Python
python django中8000端口被占用的解决
Dec 17 Python
Pytorch模型转onnx模型实例
Jan 15 Python
Python爬虫与反爬虫大战
Jul 30 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 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 数字左侧自动补0
2008/03/31 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
学习php设计模式 php实现门面模式(Facade)
2015/12/07 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
Js+XML 操作
2006/09/20 Javascript
JavaScript脚本语言在网页中的简单应用
2007/05/13 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
JavaScript实现弹窗效果代码分析
2017/03/09 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
js实现窗口全屏示例详解
2019/09/17 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
浅谈javascript如何获取文件后缀名
2020/08/07 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
python解释器安装教程的方法步骤
2020/07/02 Python
python如何实时获取tcpdump输出
2020/09/16 Python
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
荷兰超市:DEEN
2018/03/14 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
项目合作计划书
2014/01/09 职场文书
顶撞老师检讨书
2014/02/07 职场文书
《花的勇气》教后反思
2014/02/12 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书