C++调用python,直接调用模块内函数,调用类内函数

来源:互联网 发布:java手机模拟器安卓版 编辑:程序博客网 时间:2024/06/18 12:45
1,直接调用python模块内函数:
 //python初始化 Py_Initialize(); if (!Py_IsInitialized()) { printf("初始化失败!"); return -1; } //py文件及函数声明变量 PyObject *pModule = NULL; PyObject *pFunc = NULL; PyObject *pyParam = NULL; PyObject *returnArgs = NULL; //加载 try { pModule = PyImport_ImportModule("main"); } catch(...) { printf("pModule加载异常!"); } if (pModule == NULL) { printf("pModule加载失败!"); return -1; } pFunc = PyObject_GetAttrString(pModule, "myXmlParser"); if (pFunc == NULL) { printf("pFunc加载失败!"); return -1; } //调用 cout << "!!!Hello World!!!------1" << endl; // prints !!!Hello World!!! PyObject *pyParams = PyTuple_New(1); pyParam = Py_BuildValue("s", "xmodel.xml"); PyTuple_SetItem(pyParams,0, pyParam); returnArgs = PyEval_CallObject(pFunc,pyParams); string a; string b; PyArg_ParseTuple(returnArgs, "ss", &a, &b); std::cout<<"a = "<<a<<", b = "<<b<<std::endl; //清理python环境 Py_Finalize(); cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0;




2,调用python模块类内函数:
void printDict(PyObject* obj) {    if (!PyDict_Check(obj))        return;    PyObject *k, *keys;    keys = PyDict_Keys(obj);    for (int i = 0; i < PyList_GET_SIZE(keys); i++) {        k = PyList_GET_ITEM(keys, i);        char* c_name = PyString_AsString(k);        printf("%s\n", c_name);    }}

//python初始化Py_Initialize();if (!Py_IsInitialized()) {printf("初始化失败!");return -1;}//py文件及函数声明变量PyObject *pModule = NULL;PyObject *pyParam = NULL;PyObject *returnArgs = NULL;//加载try {pModule = PyImport_ImportModule("main");} catch (...) {printf("pModule加载异常!");}if (pModule == NULL) {printf("pModule加载失败!");return -1;}PyObject* pDict = PyModule_GetDict(pModule); //打印出来看一下    printDict(pDict);PyObject* pClass = PyDict_GetItemString(pDict, "XmlParser");PyObject* pInstance = PyInstance_New(pClass, NULL, NULL);//调用cout << "!!!Hello World!!!------1" << endl; // prints !!!Hello World!!!PyObject *pyParams = PyTuple_New(1);pyParam = Py_BuildValue("s", "xmodel.xml");PyTuple_SetItem(pyParams, 0, pyParam);returnArgs = PyObject_CallMethod(pInstance, "myXmlParser", "O", pyParams);string a;string b;PyArg_ParseTuple(returnArgs, "ss", &a, &b);std::cout << "a = " << a << ", b = " << b << std::endl;//清理python环境Py_Finalize();cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!return 0;

附python代码:

'''Created on 2013-8-1@author: nohack'''# import sys# form optparser import OptionParserimport sysimport XModelfrom XModel import parsexml_from XModel import get_root_tagfrom XModel import variableTypedef parseXml():    doc = XModel.parse('xmodel.xml')#    rootNode = doc.documentElement#    rootObj = agents.factory()#    rootObj.build(rootNode)#        def print_node(node):    print "=============================================="    print "node.attrib:%s" % node.attrib    if node.attrib.has_key("age") > 0 :        print "node.attrib['age']:%s" % node.attrib['age']    print "node.tag:%s" % node.tag    print "node.text:%s" % node.text    '''class XmlParser:    def myXmlParser(self, filename):        print filename        return filename    '''class XmlParser :    def myXmlParser(self, filename):        print 'aaaaaaaaaaaaaaaaaaaaaaaaaaa =',filename        doc = parsexml_('xmodel.xml')        rootNode = doc.getroot()        rootTag, rootClass = get_root_tag(rootNode)        if rootClass is None:            rootTag = 'variableType    '            rootClass = variableType        rootObj = rootClass.factory()        rootObj.build(rootNode)            doc = None        sys.stdout.write('<?xml version="1.0" ?>\n')        rootObj.export(        sys.stdout, 0, name_=rootTag,        namespacedef_='',        pretty_print=True)        print 'xmodel.attr =', rootObj.version_attr            modelsObj = rootObj.get_models()        modelObj = modelsObj.get_model()        for model in modelObj :            print model.get_file()            print model.get_enabled()            agentsObj = rootObj.get_agents()        xagentObj = agentsObj.get_xagent()        for xagent in xagentObj :            print 'agentname =', xagent.get_name()            print 'agentdes =', xagent.get_description()            memoryObj = xagent.get_memory()            variableObj = memoryObj.get_variable()            for variable in variableObj :                print 'mem.name =', variable.get_name()        return (xagent.get_name(),xagent.get_description())        #return rootObj                   # Enable Python to collect the space used by the DOM.  #               '''if __name__ == '__main__':    print "****************xml*********************start"#    parseXml()    xml = XmlParser()    xml.myXmlParser('xmodel.xml')    print "****************xml*********************end"    print "\n\n\n"        print "abcdefgh"'''



原创粉丝点击