Python手冊說你可以在C和C++中爲Python創建模塊。在使用C++時,你能利用諸如類和模板之類的東西嗎?它不會與其他圖書館和翻譯人員造成不兼容嗎?我可以在擴展Python的同時使用C++特性嗎?
回答
無論你的鉤子函數的實現是用C還是用C++實現的都沒關係。事實上,我已經看到了一些積極使用C++模板甚至Boost庫的Python擴展。 沒問題。 :-)
您感興趣的是一個名爲SWIG的程序。它將爲C++代碼生成Python包裝和接口。我使用它與模板,繼承,命名空間等,它運作良好。
如果您主要針對C++,那麼SWIG絕對不是您想要使用的工具。如果它只是你正在使用的一小部分,那麼它很好地理解C++來包裝它,但它無法觸及Boost.Python for C++的支持。 – 2009-07-27 00:49:41
@Nick:我查看了Boost :: Python庫,我不相信它是優越的。 Boost使用的所有模板和宏魔法都可能很脆弱,並且限制了代碼的功能。 – 2009-07-27 02:31:12
推動人們有一個很好的自動化方式來做Python包裝的C++代碼。
它被稱爲:Boost.Python的
它的一些C++比痛飲,尤其是模板元編程更好地構建的交易。
您應該能夠使用C++語言的所有功能。該Extending Python Documentation (2.6.2)說,你可以使用C++,但提到了以下注意事項:
它可以編寫擴展 模塊C++。一些限制 適用。如果主程序(Python 解釋器)編譯並鏈接到 ,則使用C編譯器,全局或靜態的 帶構造函數的對象不能使用 。如果 主程序由C++ 編譯器鏈接,則這不是問題。必須使用 extern「C」來聲明將由Python解釋器調用的 函數(在 特定,模塊初始化 函數中)。 不需要 extern「C」{...} - 如果定義了符號__cplusplus爲 (所有最新的C++編譯器 定義了此符號),則它們使用此格式 。
第一個限制,「與構造全局或靜態對象不能使用」,先後與方式做最C++編譯器初始化這種類型的存儲持續時間的對象。例如,請考慮下面的代碼:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
編譯器有讓之前主要被執行的「富」構造函數調用爲「F」發射的特殊代碼。如果Python擴展和中存在具有靜態存儲持續時間的對象,則Python解釋器不會被編譯並鏈接到C++,則不會創建此特殊初始化代碼。
第二個限制「必須使用extern」C「聲明將由Python解釋器調用的函數(特別是模塊初始化函數),這與C++名稱修改有關。大多數C++編譯器都會改變它們的名稱,以便它們可以使用爲C工具鏈提供的相同鏈接器。例如說你有:
void a_function_python_calls(void* foo);
C++編譯器可引用轉換爲名稱「a_function_python_calls」喜歡的東西「a_function_python_calls @ 1VGA」。在這種情況下,當您試圖鏈接到Python庫時,您可能會遇到無法解析的外部問題。
- 1. 我可以用C++擴展lisp嗎?
- 2. 我可以切換擴展器的可擴展性嗎?
- 3. C#我可以從EntityFramework擴展IdentityMessage嗎?
- 4. 我們可以使用Objective-C類來擴展C++類嗎?
- 5. 我可以使用MinGW編譯的Python擴展與Visual C++編譯的擴展一起使用嗎?
- 6. 我可以使用python開發Google Chrome擴展程序嗎?
- 7. 我可以使用Jython/Python擴展Jenkins嗎
- 8. Chrome擴展程序可以同時使用多個標籤嗎?
- 9. 我可以在UIViewController中擴展viewWillAppear嗎?
- 10. 我可以在SMLNJ中擴展typedef嗎?
- 11. 我可以在擴展Thread的類中使用ArrayList嗎?
- 12. 我可以在VB.NET中使用Structure的擴展方法嗎?
- 13. CUDA可以使用SIMD擴展嗎?
- 14. 我可以用python創建一個擴展名嗎?
- 15. 我們可以在Telerik擴展網格中的ClientTemplate中使用C#函數嗎?
- 16. python sklearn.mixture.GMM不可擴展嗎?
- 17. 我可以在sqlalchemy中使用MYSQL空間擴展嗎?
- 18. 我們可以在yii2中使用yii1擴展嗎?
- 19. 我可以在Entity Framework SubQuery中使用擴展方法嗎?
- 20. 我可以在Chrome擴展中使用js框架嗎?
- 21. 我可以在ASPX頁面內聯使用擴展方法嗎?
- 22. 我可以在XNA中使用「.fxh」文件擴展名嗎?
- 23. 我可以在擴展方法中使用泛型T嗎?
- 24. 我可以使用擴展應用程序的兩個類嗎?
- 25. 我可以在C中擴展一個結構嗎?
- 26. 我可以在C#中擴展請求方法嗎?
- 27. 我可以擴展php類型嗎?
- 28. 我可以修改或擴展ChartJS嗎?
- 29. 我可以防止擴展HorizontalScrollView嗎?
- 30. 我可以擴展Enum a la Enum.GetValues()嗎?
查看給出的答案http://stackoverflow.com/q/10368141/151641 – mloskot 2012-05-09 12:28:46