簡體   English   中英

Boost.Python是如何工作的?

[英]How does Boost.Python work?

當解釋器是C並且使用C編譯器構建時,Python如何能夠調用C ++對象?

Boost.Python有一些特殊的宏,用extern "C"聲明函數,因此Python解釋器可以調用它們。 這有點復雜,但您可以查看Boost文檔以獲取更多信息。

Python聲明了一個C-API(參見http://docs.python.org/2/c-api/http://docs.python.org/3/c-api/ )。 此API定義了一個名為PyObject的通用對象類型,它只是一個普通的C結構。 這個結構定義了(幾乎)python對象可以做的所有事情,例如,當對這個對象進行添加或比較或者簡單地將其稱為函數時會發生什么。

因為python類型也是對象(因此通過PyObject結構用C表示),所以定義一個新類型就像定義一個新的PyObject結構一樣簡單。 在Python中調用方法時,解釋器將調用轉發給與此結構關聯的C函數。

只要給定(已編譯)擴展提供正確的入口點,以便Python解釋器可以內省它並找出可用的內容(我上面指出的文檔確實詳細解釋了這一點),那么它可以像其他任何一樣使用這些對象您通常在提示符處可用的對象 - 使用完全相同的C-API構建的BTW。 您可以import已編譯的擴展名。

我希望Python解釋器如何從上面的編譯擴展中調用東西有點清楚。 唯一缺失的是C-API如何調用C ++代碼。

Boost.Python通過在代碼中聲明C入口點來實現這一點,如下所述: 優雅地從C調用C ++ 每次調用時,例如boost::python::class_ ,它都會為你聲明為python的類型執行此操作,因此創建一個代表您的類的PyObject ,並使用您選擇的名稱。 當您在此類上調用.def ,您將填充該結構的內部插槽,聲明更新的類型的方法,運算符和屬性。 每個內部插槽都指向一個C風格的函數,它只是等效C ++調用的包裝器。

C ++可以通過extern“C”聲明與C互操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM