当解释器是C并且已经用C编译器构建时,Python如何能够调用C++对象?Boost.Python是如何工作的?
回答
C++可以通过extern“C”声明与C进行互操作。
Boost.Python有特殊的宏声明extern "C"
函数,所以Python解释器将能够调用它们。这有点复杂,但你可以看看Boost documentation了解更多信息。
Python声明了C-API(请参阅http://docs.python.org/2/c-api/或http://docs.python.org/3/c-api/)。这个API定义了一个名为PyObject
的通用对象类型,它只是一个普通的C结构。这个结构定义了(几乎)一个python对象可以做的所有事情,例如,当对这个对象进行增加或比较时或者简单地将它称为函数时会发生什么。因为python类型也是对象(因此用C表示一个PyObject
结构),所以定义一个新类型就像定义一个新的PyObject
结构一样简单。当在Python中调用方法时,解释器会将调用转发给与此结构关联的C函数。
只要给定的(编译的)扩展提供了正确的入口点,以便Python解释器可以反省它并找出可用的东西(我上面指出的文档没有详细解释这一点),那么它可以使用这些对象就像通常在提示时可用的任何其他对象一样 - 顺便提一下,这些对象是使用完全相同的C-API构建的。它足够你编译的扩展名为import
。
我希望有一点清楚Python解释器如何从上面编译的扩展中调用东西。唯一的缺失是C-API如何调用C++代码。
Boost.Python通过在代码中沿着代码声明C入口点来执行此操作,如下所示:Elegantly call C++ from C。每次打电话时,例如boost::python::class_
,它都会根据您向python声明的类型执行此操作,因此会创建代表您的班级的PyObject
,并显示您选择的名称。当你在这个类上调用.def
时,你需要填充该结构的内部槽,声明更多方法,运算符和新类型的属性。这些内部插槽中的每一个都指向一种C风格的函数,它不过是对等效C++调用的封装。
- 1. python如何加载Boost.Python库?
- 2. 使用boost.python而不是bjam
- 3. 配置Visual Studio中的Boost.Python和Python工作3
- 4. 。它是如何工作的?
- 5. RegistryPermission是如何工作的?
- 6. SetVaryByCustom是如何工作的?
- 7. readyState是如何工作的?
- 8. weak_ptr是如何工作的?
- 9. Zend_Db_Table_Select是如何工作的?
- 10. Html.fromHtml是如何工作的?
- 11. Pex是如何工作的
- 12. Glide是如何工作的?
- 13. list.append是如何工作的?
- 14. js.erb是如何工作的
- 15. RewriteRule是如何工作的?
- 16. sys_open是如何工作的?
- 17. PigStorage是如何工作的?
- 18. rename_sth是如何工作的?
- 19. allocate_shared是如何工作的?
- 20. 这是如何工作的?
- 21. setPosition是如何工作的?
- 22. prunsrv.exe是如何工作的?
- 23. SuppressMessageAttribute是如何工作的?
- 24. GetProcAddress是如何工作的
- 25. IDataErrorInfo是如何工作的?
- 26. DataContext是如何工作的?
- 27. OpenID是如何工作的?
- 28. findViewById是如何工作的?
- 29. ClientIDMode是如何工作的?
- 30. 这是如何工作的?