如何在 Python 中使用 C++ 类?

Posted

技术标签:

【中文标题】如何在 Python 中使用 C++ 类?【英文标题】:How can I use C++ class in Python? 【发布时间】:2009-03-02 14:47:11 【问题描述】:

我已经用 C++ 实现了一个类。我想将它与 Python 一起使用。 请建议分步方法并详细说明每个步骤。 像这样的……

class Test
     private:
        int n;
     public:
        Test(int k)
            n=k;
        
        void setInt(int k)
            n = k; 
        
        int getInt()
            return n;
        
;

现在,在 Python 中

>>> T1 = Test(12)
>>> T1.getInt()
12
>>> T1.setInt(32)
>>> T1.getInt()
32

请建议。我该怎么做? 注意:我想知道手动方式来做到这一点。我不想要任何第三方库依赖。

【问题讨论】:

只是好奇 - 为什么要避免第三方? 【参考方案1】:

查看Boost.Python。这是一个用 C++ 编写 python 模块的库。

还可以查看SWIG,它还可以处理其他脚本语言的模块。我过去曾用它为我的班级编写模块并在 python 中使用它们。效果很好。

您可以使用Python/C API 手动完成,自己编写界面。这是相当低级的,但是您将获得很多关于 Python 在幕后工作的额外知识(而且当您使用 SWIG 时您将需要它)。

【讨论】:

不满足“我不想要任何第三方库依赖”的要求。 无论如何你都需要python库。它当然包括 python/c api。【参考方案2】:

ctypes 很好。它非常易于使用,并且是 Python 的标准配置。不幸的是,它只能与具有 C 风格接口的共享库 (Unix) 或 DLL (Windows) 通信,这意味着您不能直接与 C++ 对象交互。但是您可以使用句柄系统,其中句柄引用特定对象。

>>> getInt(h)
12

我认为这很简单,易于理解,并且不需要额外的库。

【讨论】:

您能否详细说明“您无法与共享库或 DLL 通信,这意味着您无法直接与 C++ 对象交互”是什么意思?在 Python 中使用 C++ 对象时,什么会改变行为?会不会有明显的影响?我最终需要在 Python 中编写与我的 C++ API 的绑定,提前感谢您的帮助。 @2g7hgfdr8324,你误引我了。我没有说“你不能与共享库或 DLL 对话”。我说反了。是的,如果您可以将 C++ API 公开为 DLL,那么您可以通过 ctypes 从 Python 调用它。你的界面必须是纯 C,而不是 C++。【参考方案3】:

我建议你尝试 SWIG 或 sip (KDE/PyQt)。

SWIG 链接:http://www.swig.org/ SIP链接:http://freshmeat.net/projects/python-sip/

这些可用于包装 C++ 类并为它们提供 Pythonic 接口。

【讨论】:

以上是关于如何在 Python 中使用 C++ 类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中控制c++类对象?

Boost.Python 如何拥有 C++ 类?

如何使用 cython 将 python 类公开给 c++

如何使用 PyObjects 声明 Boost.Python C++ 类

如何使用 SWIG 为 C++ 类提供 Python __repr__()

如何撤消对 Python 2D 类实例数组所做的更改,例如在 C++ 中