从 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++ 类的主要内容,如果未能解决你的问题,请参考以下文章
python 和 ctypes 访问具有嵌套结构的 c++ 类
如何使用 PyObjects 声明 Boost.Python C++ 类