在C/C++中嵌入Python也比较简单,首先需要在VC中添加Python的include文件目录和lib文件目录:
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脚本时必须使用该函数,它初始化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相关推荐

  1. 在应用中嵌入Python

    翻译: gashero 前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更 ...

  2. 在应用中嵌入Python - lf8289的专栏 - CSDNBlog

    在应用中嵌入Python - lf8289的专栏 - CSDNBlog " 在应用中嵌入Python收藏 新一篇: 软件在线升级设计方案及演变过程分析 | 旧一篇: 在windows下面关闭 ...

  3. python如何调用cpp文件的接口函数_C++中嵌入Python调用

    python嵌入到C++中 把python嵌入的C++里面需要做一些步骤 安装python程序,这样才能使用python的头文件和库 在我们写的源文件中增加"Python.h"头文 ...

  4. c中嵌入Python,提供灵活性

    我的项目进行到这个时候才发现仅仅只有c还是不能完成所有的事情,为了提供更好的个性化应用,需要一个解释性语言加入到体系中来,对比发现Python是最好的选择,不管是从性能上讲还是内存管理等各方面将都有独 ...

  5. python嵌入到程序_在应用中嵌入Python:转

    前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...

  6. 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 ...

  7. fortran语言和python_如何在Fortran中调用Python

    Python是机器学习领域不断增长的通用语言.拥有一些非常棒的工具包,比如scikit-learn,tensorflow和pytorch.气候模式通常是使用Fortran实现的.那么我们应该将基于Py ...

  8. 如何在C++中调用python程序?

    文章目录 1. Embedding Python in Another Application 将Python嵌入另一个应用程序中 1.1. Very High Level Embedding 高层嵌 ...

  9. 在iOS设备中跑Python脚本

    在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗. 这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上p ...

最新文章

  1. 【原】IOS文件操作
  2. C语言函数指针的使用
  3. 输入http://localhost/,apache出现You don't have permission to access/on this server.的提示,如何解决?...
  4. 阿里YunOS总裁张春晖:云芯片将成为IOT的基础
  5. 2016,成为更好的自己
  6. 已知贝塞尔曲线上的点求控制点
  7. git remote(远程仓库操作)
  8. 零基础物联网开发,踩坑无数,得到这份宝典 | 原力计划
  9. gitlab 汉化后502
  10. 经实验效果显著!VR虚拟帮助病人重新走路
  11. C++函数使用规范建议
  12. Solr5.2.1-Cloud-Zookeeper快速搭建
  13. PHP自动加载(下)——PSR4
  14. 计算机网络工程师考试要考哪些,网络工程师考试科目是什么
  15. 阿里云短信SDK使用
  16. asp.net 注册、卸载iis,iis重启命令
  17. 关于网站速度优化的一点建议
  18. 基于python使用CV裁剪图片
  19. MaNGOS开源魔兽世界服务端
  20. 创建自己的Repo Server

热门文章

  1. apple MacBook air m1是我认为最非常适合学生的笔记本
  2. 关于U打包代码必须放到Editor目录下的问题
  3. 【转】OpenGL随笔(1)—— mipmap 详解
  4. ubuntu配置文件对照表
  5. CocoaPods 错误解决 Attempt to read non existent folder
  6. c++11 常量表达式
  7. SLF4j、log4j管理系统日志(Maven)
  8. 思科交换机PXE响应巨慢,甚至无响应问题
  9. JFrame中使用jpanel来布局
  10. 【转载】解决Windows和Ubuntu时间不一致的问题