从Python调用C / C ++?

发布于 2021-02-02 23:23:09

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

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

关注者
0
被浏览
877
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    Boost Python库是用于连接Python和C 的框架。它使您可以快速而无缝地将C 类的函数和对象暴露给Python,反之亦然,而无需使用特殊工具-仅使用C 编译器即可。它被设计为以非介入方式包装C 接口,因此您不必为了包装而完全更改C ++代码,从而使Boost.Python成为将第三方库公开给Python的理想选择。该库对高级元编程技术的使用简化了用户的语法,因此包装代码具有一种声明性接口定义语言(IDL)的外观。



  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    ctypes是标准库的一部分,因此比swig更稳定和更易于使用,后者经常会给我带来麻烦。

    使用ctypes时,你需要满足对python的任何编译时依赖性,并且绑定将对任何具有ctypes的python起作用,而不仅仅是针对ctypes的python。

    假设你要在一个名为foo.cpp的文件中讨论一个简单的C ++示例类:

    #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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看