Python作为世界上***的 胶水 语言(哼,世界上***的语言当然是PHP==),利用Python的简洁和C++的高效,基本可以解决99%的问题了吧~
在克州等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、做网站 网站设计制作定制开发,公司网站建设,企业网站建设,成都品牌网站建设,全网整合营销推广,成都外贸网站建设公司,克州网站建设费用合理。
一般的,Python和C++的交互分为这两种情况:
Boost.Python
Boost作为一个大宝库,提供了我们所需要的这一功能。并且,在Boost的许多库中,已经默认使用了Boost.Python,所以也算是经过了充分的测试。
安装
Boost的大部分功能都是以头文件的形式提供的,无需安装;但是也有少部分功能,需要进行手动编译。不幸,Boost.Python也是其中之一。
参照 Getting Started on Unix Variants 的第五部分内容,即可安装Boost.Python。安装完成后,可以在相关目录(我的是/usr/local/lib下)看到相关的so文件。
Hello World
用C++实现一个模块,在Python中调用时,可以返回一个特定的字符串。
++
- #include
- char const* greet()
- {
- return "hello, boost";
- }
- BOOST_PYTHON_MODULE(hello_boostpy)
- {
- using namespace boost::python;
- def("greet", greet);
- }
太简单了,代码基本说明了一切~
将其编译成动态链接库的形式:
- g++ -I /usr/include/python2.7/ -fPIC -shared -o hello_boostpy.so hello_boostpy.cc -lboost_python
这时可以使用ldd看看hello_boostpy.so可不可以找到libboost_python,找不到的话,需要手动将其路径加入环境变量LD_LIBRARY_PATH中,或者用ldconfig相关的命令也可以。
接下来就可以在Python中使用hello_boostpy库了:
- # -*- coding: utf-8 -*-
- import sys
- sys.path.append('.')
- def test():
- import hello_boostpy
- return hello_boostpy.greet()
- if __name__ == "__main__":
- print test()
Expose Class
接下来,我们在C++实现的模块中,添加一个类,并且尝试向C++方向传入Python的list类型对象。
C++类:
++
- #include
- #include
- #include
- #include
- using namespace boost::python;
- struct Person
- {
- void set_name(std::string name) { this->name = name; }
- std::string print_info();
- void set_items(list& prices, list& discounts);
- std::string name;
- std::vector
item_prices; - std::vector
item_discounts; - };
其中,Python方的list类型,在Boost.Python中有一个对应的实现boost::python::list(相应的,dict、tuple等类型都有对应实现)。在set_items中,我们将会用boost::python::extract对数据类型做一个转换。
++
- void Person::set_items(list& prices, list& discounts)
- {
- for(int i = 0; i < len(prices); ++i)
- {
- double price = extract
(prices[i]); - double discount = extract
(discounts[i]); - item_prices.push_back(price);
- item_discounts.push_back(discount);
- }
- }
Python模块定义部分依旧是非常直观的代码:
- BOOST_PYTHON_MODULE(person)
- {
- class_
("Person") - .def("set_name", &Person::set_name)
- .def("print_info", &Person::print_info)
- .def("set_items", &Person::set_items)
- ;
- }
在Python代码中,就可以像使用一个Python定义的类一样使用Person类了:
- # -*- coding: utf-8 -*-
- import sys
- sys.path.append('.')
- def test():
- import person
- p = person.Person()
- p.set_name('Qie')
- p.set_items([100, 123.456, 888.8], [0.3, 0.1, 0.5])
- print p.print_info()
- if __name__ == "__main__":
- test()
Py++
上面的模块封装过程,看上去还是有些枯燥,有不少地方都是重复的工作。那么可不可以自动的进行呢?Py++提供了这样的能力,它可以帮你自动生成Boost.Python的相关代码,对于接口数量比较多的模块来说,可以极大的减少工作量,也减少了出错的概率。具体使用方法,可以参见 Tutorial
当前标题:打通Python和C++之后?你懂的!
转载来于:http://www.shufengxianlan.com/qtweb/news4/64204.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联