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中Python 环境软件包安装步骤
Mar 31 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
python f-string式格式化听语音流程讲解
Jun 18 Python
OpenCV 模板匹配
Jul 10 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
Python学习笔记之Zip和Enumerate用法实例分析
Aug 14 Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 Python
Django models文件模型变更错误解决
May 11 Python
Python识别处理照片中的条形码
Nov 16 Python
python中%格式表达式实例用法
Jun 18 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
PHP4引用文件语句的对比
2006/10/09 PHP
PHP新手上路(十一)
2006/10/09 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
2013/06/27 PHP
php中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
Laravel使用消息队列需要注意的一些问题
2017/12/13 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
jQuery移除或禁用html元素点击事件常用方法小结
2017/02/10 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
2015/04/25 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
2019/08/02 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
阿联酋网上花店:Ferns N Petals
2018/02/14 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
财务出纳岗位职责
2014/02/03 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
离职报告范文
2014/11/04 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
MySQL之select、distinct、limit的使用
2021/11/11 MySQL
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS