文章出處

Boost.Python簡單概括:是Boost庫的一部分;用來在C++代碼中調用python代碼以及在Python代碼中調用C++代碼,并且避免用戶直接操作指針。

以下內容搬運自:https://wiki.python.org/moin/boost.python/GettingStarted

簡介

BoostPython庫讓C++和Python幾乎無縫結合,是Boost庫的一個功能。

用BoostPython庫,能快速、容易地將C++輸出到Python,使得Python接口和C++接口非常像。它被設計成盡可能貼近你的C++設計。大多數情況下,你不需要修改C++類就能在Boost.Python中使用它。系統會簡單地映射你的C++類和函數到Python。Boost.Python的這種綁定,是純C++實現的,除了編輯器和編譯器你什么別的都不需要。

Python C++-sig(http://www.python.org/sigs/current/cplusplus-sig/)維護了本庫用戶郵件列表。當前版本文檔在`http://www.boost.org/libs/python/。開發文檔在http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/boost/boost/libs/python/doc/index.html`可以查到,往往是最新的

Boost.Python和Python C API的關系

Python已經提供了API,用于粘合Python和C。那Boost::Python又是什么?Boost::Python是Python/C API的一個封裝(wrapper)。

使用Python/C API,你需要在Python和C代碼之間傳遞指針的前后,手動處理指針問題,比如指針不再指向原來的對象時,Boost::Python接管了這項任務,自動處理。此外,Boost::Python使我們能用C++的OOP方式,在Python對象上寫操作。

比如,對于Python代碼y=object_x[i],同樣的功能用Python/C API實現,需要這樣寫:

y=PySequence_GetItem(object_x, i);

作為對比,用Boost::Python這樣寫就行了:

y=object_x[i];

此外,Boost::Python使得將我們的C++類輸出為Python變得容易,甚至都不需要改變。Boost::Python的設計理念是:用戶永遠不需要接觸PyObject*

如果你需要潛在Python/C API
用了Boost:Python后仍然可以用Python/C API寫東西。甚至都不必引入python.h頭文件,就可以用相關的函數了。比如在C++中清除掉一個Python錯誤,可以在一個Boost::Python程序中插入這行:

PyErr_Clear();

在C++中,Python/C API用PyObject指針來表示Python對象。而在Boost::Python中,這些用boost::python::object類的實例來封裝(替代了直接用指針的表示)。

你如果需要某個boost::python::object的PyObject,可以通過boost::python::object的ptr()方法來獲取到,它返回的是一個PyObject*。然后你可以使用Python/C API調用。比如,我有個boost::python:object的實例叫boostObj,我想知道它是否有一個叫做myAttributeName的屬性,那就:

PyObject_HasAttrString(boostObj.ptr(), "myAttributeName");

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()