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++做后续处理。下一次我们就完整的实现他
本文采用的所有例子和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++做后续处理。下一次我们就完整的实现他