从 python 访问 c++ 类

Posted

技术标签:

【中文标题】从 python 访问 c++ 类【英文标题】:Accessing c++ class from python 【发布时间】:2012-05-07 22:30:45 【问题描述】:

我在单个 .cpp 文件中有一个大的 c++ 程序,它定义了很多类(相互依赖),最后运行一个主函数。现在我只对在 python 中使用其中一个类感兴趣,特别是这个类的一种方法,它接受 5 个浮点数作为输入并输出一个浮点数。我试图找到最简单的方法来实现这一点。在 boost:python 没有成功之后(主要是因为安装问题),我来到了 Cython,它在当前版本中支持 C++。我可以成功运行 Cython 教程中给出的 Rectangle 示例,但我不知道如何继续并使其适应我不需要如此复杂的 .pyx 文件且没有 .h 的情况文件。如果我的 .cpp 文件具有例如结构,有人可以用简单的话解释我应该在 setup.py 和 .pyx 文件中写什么:

...
class Nuclei 
public:
...
    double potential(float,float,float,float,float);
...
private:
...
;
...

【问题讨论】:

【参考方案1】:

如果您只想调用一个函数,Extending Python With C/C++ 可能是最简单的方法。 This page 提供了一个很好的例子。

该示例中的相关 setup.py 代码是

from distutils.core import setup, Extension

module1 = Extension('demo',
                    define_macros = [('MAJOR_VERSION', '1'),
                                     ('MINOR_VERSION', '0')],
                    include_dirs = ['/usr/local/include'],
                    libraries = ['tcl83'],
                    library_dirs = ['/usr/local/lib'],
                    sources = ['demo.c'])

setup (name = 'PackageName',
       version = '1.0',
       description = 'This is a demo package',
       author = 'Martin v. Loewis',
       author_email = 'martin@v.loewis.de',
       url = 'http://docs.python.org/extending/building',
       long_description = '''
This is really just a demo package.
''',
       ext_modules = [module1])

如果您要调用的 C++ 代码在 demo.c 中,则可以在 Python 中与 import demo 一起使用。

请注意,这并不是那么简单——您将创建一个函数,该函数接受一个带有参数的 PyObject * 并返回一个 PyObject *,关于它们是如何构造的可以说很多。看看上面链接的页面 - 它们充满了示例。

【讨论】:

以上是关于从 python 访问 c++ 类的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost::python 从 c++ 函数访问大表

python 和 ctypes 访问具有嵌套结构的 c++ 类

从 python 传递到 C++ 的数组中未映射的内存访问

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

AttributeError:python:未定义符号:使用 ctypes 从 Python 访问 C++ 函数时

从python中访问c++对象