Python嵌入C++

 

Python嵌入C++详解(1)--HelloWorld

 

来CSDN的时候,刚刚接触Python,那时候对Python的嵌入部分很感兴趣,只是一直没有时间来弄清其面纱,因此也一直没有使用嵌入的功能,另一个原因是我还没有真正用Python写过一个正式的有用点的东西,不过,现在回过头来继续看这一部分,发现还是挺简单的。以前想把这部分翻译出来,可是由于时间原因,也没有那精力,所以这里我会将我所探究的每个Python/C嵌入部分函数都用实例来说明,我想看代码比我解释要通俗易懂。

再说helloworld之前,先不得不提下嵌入的配置问题。

步骤:

1:请到官网下载python的安装程序,安装python(我想这步有点多余,不过还是写上吧)

2:接着你可能还需要下载python(与安装版本相同)源代码,因为我们需要在debug下编译链接生成对应的debug库,若你能在网上找到别人已经编译好的库,你也可以直接用别人的。这样得到2个debug版本的.lib和.dll

3:将python目录下的include文件夹下的文件移到编译系统的include中,然后将release和debug版本的.lib和.dll放到指定的文件夹中(lib放到编译系统lib,dll放到windows/system32/)

4:好了,配置就此完成了。

来看代码:

#include "python/python.h"  //我是将python那些头文件放在我自己建的名为python的文件夹中

int main(int argc,char** argv)
{
 Py_Initialize();//该函数启动python解释器,算是初始化

//载入文件的方式运行指令,FILE是C标准库stdio.h文件中的一个结构,习惯C语言的应该很熟悉(不过我还是第一次使用,汗...)

 FILE * fr;
 fopen_s(&fr,"test.txt","r");
 PyRun_SimpleFile(fr,"test.txt");
 fclose(fr);

//直接运行指令,指令都是字符串,注意3.1.1版的python必须加上小括号

 PyRun_SimpleString("print('Hello world,I am python!')");

///

 Py_Finalize();   //该函数关闭python解释器,算是扫尾

 return 0;
}

//附带test.txt
/*
from time import time,ctime
print('Today is', ctime(time()))
*/

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiadasong007/archive/2009/09/02/4511841.aspx

 

 Python嵌入C++详解(2)--Import Module

 

首先,我不得不提到一个非常好的网站:http://www.codase.com/index.html

这是我在查找嵌入函数时发现的,里面有非常多的实例小代码,实在是相见恨晚啊(呵呵)

前面说明了嵌入需要的配置(见http://blog.csdn.net/xiadasong007/archive/2009/09/02/4511841.aspx),这次主要是为了说明如何在C/C++中调用Python模块中的函数的基本方法。

前置说明:

1:PyObject * obj这个东西有点像SDK中句柄的感觉。

2:调用Python模块流程:首先要载入模块,载入完后就可以直接访问了(⊙o⊙)哦~!很简单的~

好,来看代码:

#include "python/python.h"


#include <iostream>
using namespace std;

int main(int argc,char** argv)
{
 PyObject *pModule, *pFunc, *pValue;

 Py_Initialize();
 


 pModule=PyImport_ImportModule("mat");    //mat是我自己用python写的一个小模块(mat.py),里面内容见后面附录

 pValue=PyObject_CallMethod(pModule,"add","ii",10,20);   //通过上面得到的模块直接访问模块里面的函数add(a,b)

                                                                                       //注意这里的"ii"事实上相当于C中的"%d%d"的功能,请参考文档
 cout<<PyLong_AsLong(pValue)<<endl;            //将得到的pValue值转换为C中的long型

  pFunc=PyObject_GetAttrString(pModule, "add");  //也可以使用该函数得到函数对象
  pValue=PyObject_CallFunction(pFunc,"ii",1,2);    //通过函数对象执行函数
 cout<<PyLong_AsLong(pValue)<<endl;
 
 Py_Finalize();
 return 0;
}

//附录:mat.py

/*

def add(a,b):

      return a+b

*/

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiadasong007/archive/2009/09/02/4512797.aspx

 

Python嵌入C++详解(3)--Import Class


继前篇《Import Module》(http://blog.csdn.net/xiadasong007/archive/2009/09/02/4512797.aspx),继续分析嵌入部分基础知识。这次不多说,有什么问题记得多查英文资料,国内的这方面知识少

还是来看代码,写完我就睡觉了~

 
#include "python/python.h"
#include <iostream>
using namespace std;

int main(int argc,char** argv)
{
 PyObject *pModule, *pClass,*pStuObj,*pFunc;

 Py_Initialize();
 
 //载入模块stu.py
 pModule = PyImport_ImportModule ("stu");

 //从模块中得到类Student
 pClass = PyObject_GetAttrString (pModule, "Student");

 //生成一个学生对象jack,注意3.1版本必须加上小括号:(s),否则会出错
 //PyObject_CallObject和另外一个常用的PyEval_CallObject用法极为相近,请看附录部分详解
 PyObject * temp=Py_BuildValue("(s)","jack");
 pStuObj = PyObject_CallObject(pClass, temp);

    //获得函数对象jack中的成员函数printName,
    //这个getattr的意思就是得到当前对象的属性(不要局限于C++中的属性哦)
  pFunc= PyObject_GetAttrString (pStuObj, "printName");

 //调用函数printName
  PyEval_CallObject (pFunc, NULL);


 
 Py_Finalize();
 return 0;
}


/*
附录:

1:Student类,我发现print后面现在必须加上小括号了,否则会有问题

class Student:
    name=""
    def __init__(self,name):
        self.name=name
    def printName(self):
        print (self.name)

2:PyObject_CallObject和 PyEval_CallObject不同之处:
可以看出,后者较为直接,而且接受NULL,and does explicit type checks
for args and kwds.

PyObject_CallObject(PyObject *o, PyObject *a)
{
!  PyObject *r;
!  PyObject *args = a;
!
!  if (args == NULL) {
!   args = PyTuple_New(0);
!   if (args == NULL)
!    return NULL;
!  }
!
!  r = PyEval_CallObject(o, args);
!
!  if (args != a) {
!   Py_DECREF(args);
!  }
!
!  return r;
}

PyObject_CallObject(PyObject *o, PyObject *a)
{
!  return PyEval_CallObjectWithKeywords(o, a, NULL);
}
*/

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xiadasong007/archive/2009/09/03/4513615.aspx

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值