请教编程高手一个python与C++相互调用的问题
你好!我最近在研究如何利用python向C++中传递一个结构体的列表,结构体中包含两三种数据,使用列表传递这样的多个结构体,现在已经实现用pyd文件将两种语言相互调用了,...
你好!我最近在研究如何利用python向C++中传递一个结构体的列表,结构体中包含两三种数据,使用列表传递这样的多个结构体,现在已经实现用pyd文件将两种语言相互调用了,但是不知道怎么传递这样复杂的数据。
此外,C++又如何讲这样的结构体列个表传回给python,python用什么函数或者库可以进行解析?
看过ctypes库或者boosttype,不是十分清楚如何下手,希望了解的人提供一些方法,或者参考,非常感谢! 展开
此外,C++又如何讲这样的结构体列个表传回给python,python用什么函数或者库可以进行解析?
看过ctypes库或者boosttype,不是十分清楚如何下手,希望了解的人提供一些方法,或者参考,非常感谢! 展开
2个回答
展开全部
//使用boost_python
//从C++返回列表给python,文档已经说的很清楚了,我贴上来你注意看
// Copyright Joel de Guzman 2005-2006. Distributed under the Boost
// Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <vector>
using namespace boost::python;
class Abstract
{
public:
virtual ~Abstract() {}; // silence compiler warningsa
virtual std::string f() =0;
};
class Concrete1 : public Abstract
{
public:
virtual std::string f() { return "harru"; }
};
typedef std::vector<Abstract*> ListOfObjects;
class DoesSomething
{
public:
DoesSomething() {}
ListOfObjects returnList()
{
ListOfObjects lst;
lst.push_back(new Concrete1()); return lst;
}
};
BOOST_PYTHON_MODULE(pointer_vector_ext)
{
class_<Abstract, boost::noncopyable>("Abstract", no_init)
.def("f", &Abstract::f)
;
class_<ListOfObjects>("ListOfObjects")
.def( vector_indexing_suite<ListOfObjects>() )
;
class_<DoesSomething>("DoesSomething")
.def("returnList", &DoesSomething::returnList)
;
}
//从python传结构体给C++,可以用class的思考方式实现啊,在C++里面struct和class基本等同,用boost::python很容易实现的,
//从C++返回列表给python,文档已经说的很清楚了,我贴上来你注意看
// Copyright Joel de Guzman 2005-2006. Distributed under the Boost
// Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <vector>
using namespace boost::python;
class Abstract
{
public:
virtual ~Abstract() {}; // silence compiler warningsa
virtual std::string f() =0;
};
class Concrete1 : public Abstract
{
public:
virtual std::string f() { return "harru"; }
};
typedef std::vector<Abstract*> ListOfObjects;
class DoesSomething
{
public:
DoesSomething() {}
ListOfObjects returnList()
{
ListOfObjects lst;
lst.push_back(new Concrete1()); return lst;
}
};
BOOST_PYTHON_MODULE(pointer_vector_ext)
{
class_<Abstract, boost::noncopyable>("Abstract", no_init)
.def("f", &Abstract::f)
;
class_<ListOfObjects>("ListOfObjects")
.def( vector_indexing_suite<ListOfObjects>() )
;
class_<DoesSomething>("DoesSomething")
.def("returnList", &DoesSomething::returnList)
;
}
//从python传结构体给C++,可以用class的思考方式实现啊,在C++里面struct和class基本等同,用boost::python很容易实现的,
展开全部
python 我不懂,了解过,似乎是解释型语言,不过有py2exe这东西,
如果你知道python的结构体在内存中的组织形式,那你把数据的内存组织形式告诉我,我可以给你封装一个库,这个库提供C++接口接收你的结构体参数
如果你自己懂某一操作平台下的C++底层实现(懂汇编就ok),这问题分分钟搞定
如果你懂python的底层实现,你根本不会遇到这种问题!!!!
如果你知道python的结构体在内存中的组织形式,那你把数据的内存组织形式告诉我,我可以给你封装一个库,这个库提供C++接口接收你的结构体参数
如果你自己懂某一操作平台下的C++底层实现(懂汇编就ok),这问题分分钟搞定
如果你懂python的底层实现,你根本不会遇到这种问题!!!!
更多追问追答
追问
你好
如果你自己懂某一操作平台下的C++底层实现(懂汇编就ok),这问题分分钟搞定
如果你懂python的底层实现,你根本不会遇到这种问题!!!!
这两句话怎么养理解,可否详细解释下第一句?
追答
你知道C语言的各种数据类型在内存中是什么存储的吗?
你知道结构体在内存中是怎么存储的吗?(请注意,这里涉及到内存对齐的问题)
你知道 C语言的数据 强制类型转换在内存中是怎么实现的吗?
知道这些其实已经能搞定你最初想解决的问题了
如果 你要达到我我的那句话的境界
你还需要 了解一点汇编语言
这样 你就可以说自己熟悉某一操作平台(现在主流的windows 跟linux)下的C/C++(底层上面 C跟C++实现毫无任何差别)底层实现了
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询