将 Python 绑定(bind)到 C 或 C++ 库的最快方法是什么?
(如果这很重要,我使用的是 Windows。)
ctypes模块是标准库的一部分,因此比 swig 更稳定和更广泛可用,这总是倾向于给我problems .
使用 ctypes,您需要满足对 python 的任何编译时依赖性,并且您的绑定(bind)将适用于任何具有 ctypes 的 python,而不仅仅是编译它所针对的那个。
假设你有一个简单的 C++ 示例类,你想在一个名为 foo.cpp 的文件中与之对话:
#include <iostream>
class Foo{
public:
void bar(){
std::cout << "Hello" << std::endl;
}
};
由于 ctypes 只能与 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
我是一名优秀的程序员,十分优秀!