C++ 嵌入 Python3 -==- 1

1. C++ 嵌入 Python3 -==- 1 
  本文采用的所有例子和Python脚本,是基于VS2008和Python3.2.2 官方安装包编译通过
  python32_d.lib python32_d.DLL 这个是Debug模式下程序需要的文件,需要下载源代码自己编译
  Python-3.2.2\PCbuild\pcbuild.sln 编译过程很简单,如果你不想编译可以发邮件给我
  同时我上传了一份到CSDN blog上: 


2. 开始漫游吧,因为提前完成了年度计划,所以最近一直在漫游状态


提出问题
 在某个C++应用程序中,我们用一组插件来实现一些具有统一接口的功能,我们使用Python来代替动态链接库形式的插件,
   这样可以方便地根据需求的变化改写脚本代码,而不是必须重新编译链接二进制的动态链接库。Python强大的功能足以胜任,
   但是有一些操作系统特定的功能需要用C++来实现,再由Python调用。所以,最基础地,我们需要做到:
2.1. 把Python嵌入到C++应用程序中,在C++程序中调用Python函数和获得变量的值;
2.2. 用C++为Python编写扩展模块(动态链接库),在Python程序中调用C++开发的扩展功能函数。
2.3. 上面2点是来自vckbase 里面关于Python 2.X和 VC集成,当初我第一次看我觉得需求真的不难,呵呵,说起来容易做起来难啊
  从同学的2个需求入手:
  2.3.1 写一个爬虫,收集所有网站上关于设定条件的数据-==- 这个我写了好久,大部分技术点已经走通了
  2.3.2 现在某款游戏很流行,但是维护操作太麻烦了,有良好的接口 -==- 团队需要一个机器人客户端,这个我也写了2周,主要技术点已经走同了
      下面所有的研究都是给予需求3.2的一些探索


3一个最简单的嵌入Python3的例子


#include "stdafx.h"
#include "Python.h"


int main(int argc, _TCHAR* argv[])
{
Py_Initialize();


Py_Finalize();
return 0;
}


如果这个编译通过,说明你的环境配置正确了,恭喜你


4. 打开Python3的IDE,写一段脚本
###########################################################
#

# iQSRobots Research
# 使用范围:Python3 + T4

#
__filename__= "Hello.py"
__author__  = "Eagle Zhao(eaglezzb@gmail.com"
__version__ = "$Revision: 1.0 $"
__date__    = "$Date: 2011/11/15 21:57:19 $"
__copyright__   = "Copyright (c) 2011 Eagle"
__license__     = "iQS"
###########################################################


def Hello():
    print("Hello, Python3.2.2!")


上面看不懂的,我相信对这篇文章不感兴趣,霍霍


5.  C++ 调用一段Python脚本的函数


#include "stdafx.h"
#include "Python.h"


int main(int argc, char* argv[])
{
//--===========================================---
Py_Initialize();
//--===========================================---


PyObject * pModule = NULL;
PyObject * pFunc   = NULL;


pModule = PyImport_ImportModule("Hello"); // 这个地方是调用Hello.py文件,别加后缀
pFunc   = PyObject_GetAttrString(pModule, "HelloPyhton3"); // 调用函数

if ( NULL != pFunc )
{
PyEval_CallObject(pFunc, NULL);
}


//--===========================================---
Py_Finalize();
//--===========================================---
return 0;
}


编译好之后,在 cmd下面执行看结果: 上截图


6. 总结一下
6.1 包含头文件 #include "Python.h"
6.2 使用python之前,要调用Py_Initialize();这个函数进行初始化。灰常重要
6.3 声明一些Python的变量,PyObject类型的。 PyObject* 是指针类型
6.4 import module 脚本名字(不需要加后缀名)
6.5 得到函数名字
pFunc   = PyObject_GetAttrString(pModule, "HelloPyhton3");
6.6 调用PyEval_CallObject来执行你的函数,本函数无参数写个NULL
6.7 调用Py_Finalize(这个和COM差不多,初始化->释放)


其实我想做的事情是把Python 请求的HTTP数据返回的页面分析后,传给C++做后续处理。下一次我们就完整的实现他

posted on 2011-12-01 15:14  Eaglezzb  阅读(635)  评论(0编辑  收藏  举报

导航