1. 程式人生 > >Python呼叫採用Boost Python封裝的c++(2)

Python呼叫採用Boost Python封裝的c++(2)

     上次我寫了利用Python提供的API封裝c函式,並呼叫。但是由於利用API的方式過於原始,對於類或者結構極度麻煩。因此,我選擇了BoostPython的來封裝類,類似的工具還有SWIG等,選擇Boost的原因是它不需要引入其他的介面描述語言,封裝也是c++程式碼;另外,它支援的c++特性比較全。

   下面貼一個例子,這個例子覆蓋的面很全,需要好好理解。這個例子,是研究怎麼封裝C++。下一節,我會寫一些高階的用法。

  1. #include <boost/python.hpp>
  2. #include <boost/python/module.hpp>
  3. #include <boost/python/def.hpp>
  4. #include <boost/python/to_python_converter.hpp>
  5. #include
  6. usingnamespace std;
  7. usingnamespace boost::python;
  8. namespace HelloPython{
  9. // 簡單函式
  10. charconst* sayHello(){
  11. return"Hello from boost::python";
  12.   }
  13. // 簡單類
  14. class HelloClass{
  15. public:
  16.     HelloClass(const string& name):name(name){
  17.     }
  18. public:
  19.     string sayHello(){
  20. return"Hello from HelloClass by : " + name;
  21.     }
  22. private:
  23.     string name;
  24.   };
  25. // 接受該類的簡單函式
  26.   string sayHelloClass(HelloClass& hello){
  27. return hello.sayHello() + " in function sayHelloClass";
  28.   }
  29. //STL容器
  30. typedef vector<int> ivector;
  31. //有預設引數值的函式
  32. void showPerson(string name,
    int age=30,string nationality="China"){
  33.     cout << name << " " << age << " " << nationality << endl;
  34.   }
  35. // 封裝帶有預設引數值的函式
  36.   BOOST_PYTHON_FUNCTION_OVERLOADS(showPerson_overloads,showPerson,1,3) //1:最少引數個數,3最大引數個數
  37. // 封裝模組
  38.   BOOST_PYTHON_MODULE(HelloPython){
  39. // 封裝簡單函式
  40.     def("sayHello",sayHello);
  41. // 封裝簡單類,並定義__init__函式
  42.     class_("HelloClass",init())
  43.       .def("sayHello",&HelloClass::sayHello)//Add a regular member function
  44.       ;
  45.     def("sayHelloClass",sayHelloClass); // sayHelloClass can be made a member of module!!!
  46. // STL的簡單封裝方法
  47.     class_("ivector")
  48.       .def(vector_indexing_suite());
  49.     class_ >("ivector_vector")
  50.       .def(vector_indexing_suite >());
  51. // 帶有預設引數值的封裝方法
  52.     def("showPerson",showPerson,showPerson_overloads());
  53.   }

相關推薦

Python呼叫採用Boost Python封裝c++2

     上次我寫了利用Python提供的API封裝c函式,並呼叫。但是由於利用API的方式過於原始,對於類或者結構極度麻煩。因此,我選擇了Boost的Python的來封裝類,類似的工具還有SWIG等,

Python——內置函數2

pri 篩選 遍歷 真的 pytho 遍歷序列 最終 bsp red 1、map 遍歷序列,對序列中的每個元素進行操作,最終獲取新的序列li = [11,22,33] l1=[1,2] l2=[1,2] l3=[1,2] def func(arg): retu

python學習_day54_前端基礎之js2

data 截取 定義 得到 let 結果 是什麽 index 插入   在JavaScript中除了null和undefined以外其他的數據類型都被定義成了對象,也可以用創建對象的方法定義變量,String、Math、Array、Date、RegExp都是JavaScri

python之文件的讀寫2

import 文件讀寫 哈哈 進入 imp std 技術 都是 繼續 小R昨天因為在研究weblogic的漏洞就沒來得及學習python(好吧,這都是借口,懶了,大家可不能像我這樣。要堅持每天都學)。 這個進度是有點慢呀。哎呀,沒事沒事,我還年輕,才20歲。 哈哈,玩

Python的學習筆記DAY7---關於爬蟲2之Scrapy初探

        首先是安裝,python3+windows10 64位。         安裝Scrapy,安裝,直接pip install Scrapy.....下載了半天報錯。。好像是沒有lxml這

Python菜鳥快樂遊戲程式設計_pygame2

Python菜鳥快樂遊戲程式設計_pygame(博主錄製,2K解析度,超高清) https://study.163.com/course/courseMain.htm?courseId=1006188025&share=2&shareId=400000000398149  

Python語言資料結構和語言結構2

1. Python預備基礎 變數的命名 變數命名規則主要有以下幾條: 變數名只能包含字母、數字和下劃線,其中下劃線和字母可以開頭,數字不行,即info_1可以,而1_info不行; 變數名內不能包含空格,可以用下劃線替代,即info_1,而非info 1; 不能與Pyt

python中對閉包的理解2

上一篇介紹了閉包的概念,這一篇介紹下閉包的使用過程中需要注意的問題。 def count(): fs = [] for i in range(1,4): def f(): return i*i fs.append(f)

Python web 開發】使用者註冊功能2

我們繼續來完善使用者的註冊功能 註冊的時候前端post過來 手機號,驗證碼,密碼,而密碼和驗證碼我們只需要在serialzers 裡面驗證用,不需要序列化返回給前端 正常的serialzers  是怎樣的邏輯呢? 我們來看下CreateModelMixin 的原始碼  

Python資料分析與挖掘學習筆記2使用pandas進行資料匯入

一、匯入pandas模組:   import pandas as pda 二、匯入CSV格式資料: #資料匯入 i=pda.read_csv("E:/hexun.csv")     可對匯入的資料進行統計以及按列排序: #統計 i.describe() #排序 i

【學習筆記】使用python批量讀取並修改xml檔案2

在大老闆的安排下最近在某公司實習,實習期間要求實現一個影象識別模組的封裝。無奈基礎太薄弱,只能將任務細分,單獨學習來實現。以此為背景…… 這一篇記錄一些在實際使用中踩到的坑。在實際使用中,我在A資料夾下對圖片進行了標註,隨後將圖片移動到B資料夾下。那麼相應的,標註後的xml檔案中,<p

python學習記錄之---------PYQT5做工具2下拉選項框的使用

工具/版本(1)安裝環境:Windows7 64bit(2)使用版本Python3.6(3)PYQT5(4)eric6-6.1.0基本的使用前文有介紹,直入正題初始形態選擇省份後,列出對應省份所有城市,都選擇後,點選開始,顯示在文字框中實現方法,首先將所有省份和對應城市放在對

Python基礎學:內建型別2

5.迭代器型別       Python支援對容器進行迭代的概念。他有兩種不同的實現方法,但都可以歸於使用使用者自定義的類實現迭代。接下來,將詳細解釋說明:       第一種方法需要定義容器物件以提供迭代基礎:container. __iter__()該方法返回一個迭代器物

OS_FLAG.C2

本篇介紹OS_FLAG.C檔案中的建立事件標誌組函式*OSFlagCreate (OS_FLAGS  flags,INT8U *perr)和刪除事件標誌組函式 *OSFlagDel (OS_FLAG_GRP  *pgrp,INT8U  opt,INT8U  *perr)。OS

Android okHttp封裝2 -- okhttp-OkGo

OkGo - OkHttpUtils-2.0.0 升級後改名 OkGo,全新完美支援RxJava 該庫是封裝了okhttp的標準RESTful風格的網路框架,可以與RxJava完美結合,比Retrofit更簡單易用。支援大檔案上傳下載,上傳進度回撥,下載進度回撥

pythonC++的相互呼叫2

上文簡單介紹了python,以及在C中進行python模組的匯入、函式、類介面的獲得等比較基本的操作。接下來我們考慮:當我們已經獲得了函式的介面之後,我們就應該能夠對他進行呼叫了,接下來我們就來說一說函式的引數和返回值的問題。上文已經說了在python的世界裡一切都是以P

新手學python2C語言呼叫完成資料庫操作

繼續介紹本人的python學習過程。本節介紹如何利用python呼叫c程式碼。內容還是基於音樂資訊提取的過程,架構如圖一。Python呼叫c實現的功能是利用python訪問c語言完成mysql資料庫操作。 在利用python呼叫c語言之前,我們需要首先完成c語言功能程式

python採用pika庫使用rabbitmq

  1 安裝: centos 執行yum install rabbitmq-server-3.5.2-1.noarch.rpm  進行安裝 ps:這裡不用 rpm -ivh rabbitmq-server-3.5.2-1.noarch.rpm進行安裝,而是用yum ins

python採用pika庫使用rabbitmq訊息確認Message acknowledgment

從上篇文章可知,每個工作者,都會依次分配到任務。那麼如果一個工作者,在處理任務的時候掛掉,這個任務就沒有完成,應當交由其他工作者處理。所以應當有一種機制,當一個工作者完成任務時,會反饋訊息。 訊息確認就是當工作者完成任務後,會反饋給rabbitmq 修改receive.py的內容: 1 def c

python採用pika庫使用rabbitmq有選擇的接收訊息(exchange type=direct)

RabbitMQ還支援根據關鍵字傳送,即:佇列繫結關鍵字,傳送者將資料根據關鍵字傳送到訊息exchange,exchange根據 關鍵字 判定應該將資料傳送至指定佇列。 1 import pika 2 import sys 3 4 connection = pika.B