91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-02 18:05:07 來源:網絡 閱讀:7637 作者:LanYuLei 欄目:編程語言

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

最近一直在想用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);
}

編譯的命令

下面的命令是我在編譯動態鏈接庫文件的命令,根據自己的實際情況修改。

# python3
g++ -shared -o helloworld.so -fPIC -I/usr/include/python3.6m/ helloworld.cpp -lpython3.6m -lboost_python3

# python2
g++ -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歲了
如果文章中步驟有不對的地方的話,請指出,我會在最快的時間內修改好,謝謝。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九江市| 无锡市| 栾川县| 奉贤区| 扶沟县| 筠连县| 梅州市| 临清市| 无极县| 小金县| 郓城县| 大同市| 雅江县| 巴林左旗| 吉林省| 富平县| 长乐市| 镇巴县| 五原县| 灌云县| 云梦县| 连平县| 吉隆县| 拉孜县| 崇信县| 乳源| 柏乡县| 九台市| 大兴区| 吉木乃县| 湟中县| 文山县| 蓬莱市| 龙江县| 丰原市| 玉林市| 修水县| 桓仁| 西华县| 甘德县| 林州市|