python调用c++类内静态函数_C++调用python,直接调用模块内函数,调用类内函数

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"

'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python调用C的类需要使用Python的ctypes库来实现。具体步骤如下: 1. 编写C程序,实现需要调用函数或类。例如: ```c // MyClass.h typedef struct { int x; int y; } Point; class MyClass { public: MyClass(); ~MyClass(); int add(int a, int b); int sub(int a, int b); Point getPoint(); }; ``` ```c // MyClass.cpp #include "MyClass.h" #include <iostream> MyClass::MyClass() { std::cout << "MyClass constructor called" << std::endl; } MyClass::~MyClass() { std::cout << "MyClass destructor called" << std::endl; } int MyClass::add(int a, int b) { return a + b; } int MyClass::sub(int a, int b) { return a - b; } Point MyClass::getPoint() { Point p; p.x = 10; p.y = 20; return p; } ``` 2. 编译C程序为动态库(或静态库)。例如,在Linux下,使用以下命令编译: ``` g++ -shared -fPIC MyClass.cpp -o libmyclass.so ``` 3. 在Python调用C程序。例如: ```python import ctypes # 加载动态库 myclass = ctypes.cdll.LoadLibrary('./libmyclass.so') # 定义C++中的结构体类型 class Point(ctypes.Structure): _fields_ = [('x', ctypes.c_int), ('y', ctypes.c_int)] # 定义C++中的类 class MyClass(object): def __init__(self): self.obj = myclass.MyClass_new() def __del__(self): myclass.MyClass_delete(self.obj) def add(self, a, b): return myclass.MyClass_add(self.obj, a, b) def sub(self, a, b): return myclass.MyClass_sub(self.obj, a, b) def getPoint(self): p = myclass.MyClass_getPoint(self.obj) return Point(p.x, p.y) # 测试 obj = MyClass() print(obj.add(1, 2)) print(obj.sub(3, 4)) print(obj.getPoint().x, obj.getPoint().y) ``` 注意,上面的代码中,我们需要将C++中的结构体类型在Python中重新定义一遍。此外,我们还需要将C++中的类在Python中重新实现一遍,包括构造函数、析构函数和其他的成员函数。在实现成员函数时,我们需要调用C函数,并将C++对象的指针作为参数传递给它们。最后,我们可以在Python中实例化这个类,并调用其中的成员函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值