成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

打通Python和C++之后?你懂的!

開發 后端
Python作為世界上最好的 膠水 語言(哼,世界上最好的語言當然是PHP==),利用Python的簡潔和C++的高效,基本可以解決99%的問題了吧~

Python作為世界上***的 膠水 語言(哼,世界上***的語言當然是PHP==),利用Python的簡潔和C++的高效,基本可以解決99%的問題了吧~

一般的,Python和C++的交互分為這兩種情況:

  1. 用C++擴展Python:當一個Python項目中出現了性能瓶頸時,將瓶頸部分抽離出來,用C++封裝成一個Python可以調用的模塊(so庫);
  2. 將Python內嵌入C++:當一個C++項目中有部分功能預期將會經常變更需求,期望獲得更高的靈活性時,將這部分功能用Python實現,在C++中進行調用。這篇文章將簡單介紹下***部分的一種做法。

打通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中調用時,可以返回一個特定的字符串。

++

 

  1. #include <boost/python.hpp> 
  2.  
  3. char const* greet() 
  4.     return "hello, boost"
  5.  
  6. BOOST_PYTHON_MODULE(hello_boostpy) 
  7.     using namespace boost::python; 
  8.     def("greet", greet); 

太簡單了,代碼基本說明了一切~

將其編譯成動態鏈接庫的形式:

  1. 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庫了:

 

  1. # -*- coding: utf-8 -*- 
  2. import sys 
  3. sys.path.append('.'
  4.  
  5.  
  6. def test(): 
  7.     import hello_boostpy 
  8.     return hello_boostpy.greet() 
  9.  
  10.  
  11. if __name__ == "__main__"
  12.     print test() 

Expose Class

接下來,我們在C++實現的模塊中,添加一個類,并且嘗試向C++方向傳入Python的list類型對象。

C++類:

++

 

  1. #include <boost/python.hpp> 
  2. #include <vector> 
  3. #include <string> 
  4. #include <sstream> 
  5. using namespace boost::python; 
  6.  
  7. struct Person 
  8.     void set_name(std::string name) { this->name = name; } 
  9.     std::string print_info(); 
  10.     void set_items(list& prices, list& discounts); 
  11.      
  12.      
  13.     std::string name
  14.     std::vector<double> item_prices; 
  15.     std::vector<double> item_discounts; 
  16. }; 

其中,Python方的list類型,在Boost.Python中有一個對應的實現boost::python::list(相應的,dict、tuple等類型都有對應實現)。在set_items中,我們將會用boost::python::extract對數據類型做一個轉換。

++

 

  1. void Person::set_items(list& prices, list& discounts) 
  2.     for(int i = 0; i < len(prices); ++i) 
  3.     { 
  4.         double price = extract<double>(prices[i]); 
  5.         double discount = extract<double>(discounts[i]); 
  6.         item_prices.push_back(price); 
  7.         item_discounts.push_back(discount); 
  8.     } 

Python模塊定義部分依舊是非常直觀的代碼:

 

  1. BOOST_PYTHON_MODULE(person) 
  2.     class_<Person>("Person"
  3.         .def("set_name", &Person::set_name) 
  4.         .def("print_info", &Person::print_info) 
  5.         .def("set_items", &Person::set_items) 
  6.     ;    

在Python代碼中,就可以像使用一個Python定義的類一樣使用Person類了:

 

  1. # -*- coding: utf-8 -*- 
  2. import sys 
  3. sys.path.append('.'
  4.  
  5.  
  6. def test(): 
  7.     import person 
  8.     p = person.Person() 
  9.     p.set_name('Qie'
  10.     p.set_items([100, 123.456, 888.8], [0.3, 0.1, 0.5]) 
  11.     print p.print_info() 
  12.  
  13.  
  14. if __name__ == "__main__"
  15.     test() 

Py++

上面的模塊封裝過程,看上去還是有些枯燥,有不少地方都是重復的工作。那么可不可以自動的進行呢?Py++提供了這樣的能力,它可以幫你自動生成Boost.Python的相關代碼,對于接口數量比較多的模塊來說,可以極大的減少工作量,也減少了出錯的概率。具體使用方法,可以參見 Tutorial

責任編輯:未麗燕 來源: 一根笨茄子
相關推薦

2009-10-22 09:17:16

C++ CLR

2023-07-17 10:28:00

C/C++編程接口

2021-07-23 16:30:36

PythonC++代碼

2018-05-15 11:14:07

面試官C++編程

2011-04-11 09:43:25

C++C

2019-01-21 09:02:03

C++Python編程語言

2021-03-26 10:35:49

C++Python編程語言

2014-01-24 09:49:01

C++指針

2024-02-26 07:26:27

RustC++開發

2025-06-17 10:00:00

函數重載函數重寫C++

2024-05-15 16:01:04

C++編程開發

2022-07-01 11:56:54

C語言C++編程語言

2021-02-26 10:41:59

C++程序員代碼

2019-07-29 10:39:39

前端性能優化緩存

2011-05-18 18:05:47

C#C++

2010-01-28 15:22:12

C++嵌套類

2009-09-16 14:56:23

C++

2011-05-18 17:56:38

C#C++

2020-06-17 12:22:44

C覆蓋重載

2011-04-06 08:57:07

C++java多態
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: a视频在线观看 | 午夜免费| 日本不卡免费新一二三区 | 欧美日韩在线视频观看 | 亚洲午夜精品视频 | 天堂一区在线观看 | 欧美一级精品片在线看 | 亚洲国产精品人人爽夜夜爽 | 亚洲一区二区三区福利 | 91久久国产综合久久 | 日韩一级 | 色婷婷久久久久swag精品 | 91精品久久久久久久久久入口 | 男女视频在线看 | 国产专区免费 | 亚洲男女视频在线观看 | 欧美成人高清视频 | 日韩高清电影 | 天色综合网 | 欧美精品一区二区在线观看 | 伊人精品一区二区三区 | 国产日韩av一区二区 | 91中文视频 | 亚洲精品国产电影 | 在线欧美视频 | 精品一二区 | 色.com| 韩日一区二区三区 | 久久亚洲国产精品 | 91精品国产一区二区三区 | 产真a观专区 | 婷婷综合激情 | 国产一级在线 | 国产成人精品免费 | 精品在线播放 | 天天爽天天干 | 久久久中文 | av网站免费观看 | 啪啪免费网站 | 性高朝久久久久久久3小时 av一区二区三区四区 | 美女视频一区二区三区 |