在C/C++中嵌入Python
VC6.0下,打开tools->options->directories->show directories for,将Python安装目录下的inlude目录添加到inlude files项中,将libs目录添加到library files项中。
VC2005下,打开tools->options->项目和解决方案->VC++目录,然后做相同工作。
代码如下:
#include <python.h>
int main()
{
Py_Initialize();
PyRun_SimpleString("Print 'hi, python!'");
Py_Finalize();
return 0;
}
Py_Initialize函数原型是:void Py_Initialize(),在嵌入Python脚本时必须使用该函数,它初始化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);
列表操作函数:
PyObject * PyList_New(Py_ssize_t len);
int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);
PyObject * PyList_GetItem(PyObject *list, Py_ssize_t index);
int PyList_Append(PyObject *list, PyObject *item);
int PyList_Sort(PyObject *list);
int PyList_Reverse(PyObject *list);
Py_ssize_t PyList_Size(PyObject *list);
元组操作函数:
int PyTuple_New(Py_ssize_t len);
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);
PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); //注意是**指针
字典操作函数:
PyObject * PyDict_New();
int PyDict_SetItem(PyObject *p, PyObject *key, PyObject *val);
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
PyObject* PyDict_GetItemString(PyObject *p, const char *key);
//与PyDict_SetItemString对应
int PyDict_DelItem(PyObject *p, PyObject *key);
int PyDict_DelItemString(PyObject *p, char *key);
//与PyDict_SetItemString对应
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
PyObject* PyDict_Items(PyObject *p);
PyObject* PyDict_keys(PyObject *p);
PyObject* PyDict_Values(PyObject *p);
在C/C++中使用Python对象应正确地处理引用计数问题,否则容易导致内存泄漏。当使用Python/C API中的函数创建列表、元组、字典等后,在对其完成操作后应该使用Py_CLEAR()和Py_DECREF()等宏来销毁这些对象。原型如下:
void Py_CLEAR(PyObject *o);
void Py_DECREF(PyObject *o);
其中,对于Py_CLEAR函数,参数可以为NULL指针,表示不进行任何操作,但是Py_DECREF函数不能为NULL指针,否则导致错误。
使用PyImport_Import()函数可以在C中导入Python模块,返回一个模块对象。函数原型为:
PyObject* PyImport_Import(PyObject *name);
PyModule_GetDict()函数可以获得Python模块中的函数列表,返回一个字典,字典中的关键字为函数名,值为函数的调用地址。原型如下:
PyObject* PyModule_GetDict(PyObject *module);
使用PyObject_CallObject()函数和PyObject_CallFunction()函数可以在C中调用Python中的函数,原型如下:
PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args);
//args是元组形式
PyObject* PyObject_CallFunction(PyObject *callable, char *format, ……);
//format是类似”iss”这样的参数类型,后面是指定参数
可以使用PyCallable_Check(func)来判断是否可以调用函数,可以则返回True。
在C/C++中嵌入Python相关推荐
- 在应用中嵌入Python
翻译: gashero 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更 ...
- 在应用中嵌入Python - lf8289的专栏 - CSDNBlog
在应用中嵌入Python - lf8289的专栏 - CSDNBlog " 在应用中嵌入Python收藏 新一篇: 软件在线升级设计方案及演变过程分析 | 旧一篇: 在windows下面关闭 ...
- python如何调用cpp文件的接口函数_C++中嵌入Python调用
python嵌入到C++中 把python嵌入的C++里面需要做一些步骤 安装python程序,这样才能使用python的头文件和库 在我们写的源文件中增加"Python.h"头文 ...
- c中嵌入Python,提供灵活性
我的项目进行到这个时候才发现仅仅只有c还是不能完成所有的事情,为了提供更好的个性化应用,需要一个解释性语言加入到体系中来,对比发现Python是最好的选择,不管是从性能上讲还是内存管理等各方面将都有独 ...
- python嵌入到程序_在应用中嵌入Python:转
前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...
- python c++情侣网名是什么意思_c++中嵌入python 看什么意思
展开全部 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ...
- fortran语言和python_如何在Fortran中调用Python
Python是机器学习领域不断增长的通用语言.拥有一些非常棒的工具包,比如scikit-learn,tensorflow和pytorch.气候模式通常是使用Fortran实现的.那么我们应该将基于Py ...
- 如何在C++中调用python程序?
文章目录 1. Embedding Python in Another Application 将Python嵌入另一个应用程序中 1.1. Very High Level Embedding 高层嵌 ...
- 在iOS设备中跑Python脚本
在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗. 这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上p ...
最新文章
- 【原】IOS文件操作
- C语言函数指针的使用
- 输入http://localhost/,apache出现You don't have permission to access/on this server.的提示,如何解决?...
- 阿里YunOS总裁张春晖:云芯片将成为IOT的基础
- 2016,成为更好的自己
- 已知贝塞尔曲线上的点求控制点
- git remote(远程仓库操作)
- 零基础物联网开发,踩坑无数,得到这份宝典 | 原力计划
- gitlab 汉化后502
- 经实验效果显著!VR虚拟帮助病人重新走路
- C++函数使用规范建议
- Solr5.2.1-Cloud-Zookeeper快速搭建
- PHP自动加载(下)——PSR4
- 计算机网络工程师考试要考哪些,网络工程师考试科目是什么
- 阿里云短信SDK使用
- asp.net 注册、卸载iis,iis重启命令
- 关于网站速度优化的一点建议
- 基于python使用CV裁剪图片
- MaNGOS开源魔兽世界服务端
- 创建自己的Repo Server