C++使用boost.python編寫Python擴充

來源:互聯網
上載者:User

標籤:有用   描述   構造   做了   tin   例子   void   封裝   路徑   

很久沒有寫文章了,今天整理了一些東西,在這裡分享一下。

最近一直在想用C++封裝一些在工作中常用的Python擴充模組,因為之前沒有用C++寫過類似的東西,因此一直在網上找一些文章,但是我發現好多文章都描述的不是很清晰,對於老鳥來說應該會很容易,但是像我這種初學者,肯定會造成很大的困擾,因為總是出現很多的報錯,搞的頭很大,因此我將成功的案例分享一下,並且詳細的解釋下讓我產生疑惑的地方。

boost.python

簡單描述

C++寫python擴充模組有很多種方式,我選擇的是boost.python來編寫的,感覺這個要比其他的方式要簡單很多,寫很少的boost.python代碼就可以,這樣就可以更專註的去寫C++的程式。

boost.python的科普就不必多說了,可以自行google,我也是自己google的。

安裝

這裡僅介紹Ubuntu的安裝方式:

sudo apt-get install libboost-all-dev

或者

sudo apt-get install libboost-python-dev# 這種方式我沒有嘗試,你們可以自己試試

源碼安裝也是可以的,但是需要配置好環境變數,否則編譯的時候總是編譯不過去,當前直接在編譯的時候指定需要的路徑也是可以的。

執行個體

C++ 代碼

下面的例子將一些模糊的點,做了一下描述。

#include <iostream>#include <string>#include <boost/python.hpp>   // 必須引入這個標頭檔using namespace boost::python;class HelloWorld{public:    HelloWorld(const std::string& name, int age);    void printInfo();private:    std::string m_name;    int m_age;};HelloWorld::HelloWorld(const std::string& name, int age):m_name(name), m_age(age){}void HelloWorld::printInfo(){    std::cout << "我叫" << m_name << ", " << m_age << "歲了" << std::endl;}void ceshi(){    std::cout << "ceshi" << std::endl;}BOOST_PYTHON_MODULE(helloworld){    // 類匯出成Python可調用的動態連結程式庫檔案的方式    class_<HelloWorld/* 類名 */, boost::noncopyable /* 單例模式,可有可無 */ >             ("helloworld", init<const std::string&, int/* init裡面就是放建構函式的參數,不需要實參 */>())//匯出類中的方法            .def("printinfo", &HelloWorld::printInfo);    // 普通函數匯出成Python可調用的動態連結程式庫檔案的方式    def("ceshi",&ceshi);}

編譯的命令

下面的命令是我在編譯動態連結程式庫檔案的命令,根據自己的實際情況修改。

# python3g++ -shared -o helloworld.so -fPIC -I/usr/include/python3.6m/ helloworld.cpp -lpython3.6m -lboost_python3# python2g++ -shared -o helloworld.so -fPIC -I/usr/include/python2.7/ helloworld.cpp -lpython -lboost_python簡單介紹下參數    -shared    // 指定產生動態連結程式庫    -o    // 產生的動態連結程式庫的名稱    -fPIC    // 表示使用地址無關代碼    -I(大寫的i)    // 表示將/usr/include/python2.7/目錄作為第一個尋找標頭檔的目錄、    -l    // 指定需串連的庫名

沒有報錯的話會在目前的目錄下產生一個名叫helloworld.so的動態連結程式庫檔案,直接在目前的目錄進入Python Shell就可以測試,當然你直接放入到Python的site-packages目錄中也是可以直接在Python Shell環境中引入的。

驗證結果

>>> import helloworld>>> hw = helloworld.helloworld("lanyulei", 18)>>> hw.printinfo()我叫lanyulei, 18歲了
如果文章中步驟有不對的地方的話,請指出,我會在最快的時間內修改好,謝謝。

C++使用boost.python編寫Python擴充

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.