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<
//清理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 OptionParser
import sys
import XModel
from XModel import parsexml_
from XModel import get_root_tag
from XModel import variableType
def 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"
'''