构建与C或C ++库的Python绑定的最快方法是什么?
(如果这很重要,我正在使用Windows。)
Boost Python库是用于连接Python和C 的框架。它使您可以快速而无缝地将C 类的函数和对象暴露给Python,反之亦然,而无需使用特殊工具-仅使用C 编译器即可。它被设计为以非介入方式包装C 接口,因此您不必为了包装而完全更改C ++代码,从而使Boost.Python成为将第三方库公开给Python的理想选择。该库对高级元编程技术的使用简化了用户的语法,因此包装代码具有一种声明性接口定义语言(IDL)的外观。
ctypes是标准库的一部分,因此比swig更稳定和更易于使用,后者经常会给我带来麻烦。
ctypes
使用ctypes时,你需要满足对python的任何编译时依赖性,并且绑定将对任何具有ctypes的python起作用,而不仅仅是针对ctypes的python。
假设你要在一个名为foo.cpp的文件中讨论一个简单的C ++示例类:
foo.cpp
#include <iostream> class Foo{ public: void bar(){ std::cout << "Hello" << std::endl; } };
由于ctypes只能与C函数对话,因此你需要提供将其声明为extern“ C”的那些函数
C
extern“ C”
extern "C" { Foo* Foo_new(){ return new Foo(); } void Foo_bar(Foo* foo){ foo->bar(); } }
接下来,你必须将其编译为共享库
g++ -c -fPIC foo.cpp -o foo.o g++ -shared -Wl,-soname,libfoo.so -o libfoo.so foo.o
最后,你必须编写python包装器(例如,在fooWrapper.py中)
from ctypes import cdll lib = cdll.LoadLibrary('./libfoo.so') class Foo(object): def __init__(self): self.obj = lib.Foo_new() def bar(self): lib.Foo_bar(self.obj)
一旦有了,你可以像这样称呼它
f = Foo() f.bar() #and you will see "Hello" on the screen