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");
文章列表