从Python调用C / C ++?

什么是构建C或C ++库的Python绑定的最快捷方式?

(如果这很重要,我正在使用Windows。)


你应该看看Boost.Python。 以下是他们网站的简短介绍:

Boost Python库是一个用于连接Python和C ++的框架。 它允许您快速无缝地将C ++类的函数和对象暴露给Python,反之亦然,不需要特殊的工具 - 只需要您的C ++编译器。 它旨在非侵入性地封装C ++接口,因此您不必为了封装而更改C ++代码,使得Boost.Python非常适合向Python公开第三方库。 该库使用高级元编程技术简化了用户的语法,使得包装代码呈现出一种声明式接口定义语言(IDL)的外观。


我喜欢ctypes很多,swig总是倾向于给我一些问题。 此外,ctypes的优点是你不需要满足任何编译时对python的依赖,并且你的绑定可以在任何具有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

最快捷的方法是使用SWIG。

SWIG教程示例:

/* File : example.c */
int fact(int n) {
    if (n <= 1) return 1;
    else return n*fact(n-1);
}

接口文件:

/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern int fact(int n);
%}

extern int fact(int n);

在Unix上构建Python模块:

swig -python example.i
gcc -fPIC -c example.c example_wrap.c -I/usr/local/include/python2.7
gcc -shared example.o example_wrap.o -o _example.so

用法:

>>> import example
>>> example.fact(5)
120

请注意,你必须有python-dev。 同样在一些系统中,python头文件将基于你安装它的方式在/usr/include/python2.7中。

从教程:

SWIG是一款相当完整的C ++编译器,支持几乎所有语言功能。 这包括预处理,指针,类,继承,甚至C ++模板。 SWIG也可用于将结构和类打包成目标语言的代理类 - 以非常自然的方式公开底层功能。

链接地址: http://www.djcxy.com/p/5385.html

上一篇: Calling C/C++ from Python?

下一篇: How much faster is C++ than C#?