zoukankan      html  css  js  c++  java
  • 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++做后续处理。下一次我们就完整的实现他
  • 相关阅读:
    Django_05_模板
    Django_04_视图
    Django_03_后台管理
    Django_02_创建模型
    Django_01_创建图书管理项目
    Djang简介
    day_03比特币转账的运行原理
    day_02比特币的转账机制及其7个名词
    day01_人类社会货币的演变
    Socket问题
  • 原文地址:https://www.cnblogs.com/eaglezzb/p/4176531.html
Copyright © 2011-2022 走看看