C++ Python导入类; 调用方法

5

我正在使用Python 2.7。对于如何将Python嵌入到C++中,我不是很清楚,可以参考这里:http://docs.python.org/2.7/extending/embedding.html

我有一个简单的Python示例,保存在名为test.py的文件中:

class math:
    #def __init__(self):
    def add(self, num1, num2):
        return num1 + num2

    def subtract(self, num1, num2):
        return num1 - num2

从Python的角度出发,我会这样做:

>>> from test import math
>>> m = math()
>>> a = m.add(1, 2)
>>> s = m.subtract(1, 2)

我有一些C++代码的开端来实现这个:

我有一些C++代码的开端来实现这个:

PyObject *pName, *pModule;
Py_Initialize();
pName = PyString_FromString("test");
pModule = PyImport_Import(pName);

看起来这个工作得很好。但是,这似乎相当于在Python中执行以下操作:

import test

我该如何导入 Python 的 math 类?

谢谢。

2个回答

11

这是一个用 C 语言快速且简单的示例,它实现了相当于...

>>> import mymath
>>> m = mymath.math()
>>> print '1 + 2 = %d' % m.add(1, 2)

请注意,我已将模块从 test 重命名为 mymath,因为 Python 标准库中有一个名为 test 的模块。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <python2.7/Python.h>

int main()
{
    setenv("PYTHONPATH", ".", 1);

    Py_Initialize();

    PyObject* module = PyImport_ImportModule("mymath");
    assert(module != NULL);

    PyObject* klass = PyObject_GetAttrString(module, "math");
    assert(klass != NULL);

    PyObject* instance = PyInstance_New(klass, NULL, NULL);
    assert(instance != NULL);

    PyObject* result = PyObject_CallMethod(instance, "add", "(ii)", 1, 2);
    assert(result != NULL);

    printf("1 + 2 = %ld\n", PyInt_AsLong(result));

    Py_Finalize();

    return 0;
}

...输出...

$ gcc foo.c -lpython2.7 && ./a.out
1 + 2 = 3

然而,如果在Py_InitializePy_Finalize之间大量使用Python/C API进行工作,您需要注意引用计数,并在适当时使用Py_INCREFPy_DECREF


谢谢。工作正如预期的那样。我唯一做的不同之处是没有包括setenv()调用。这似乎在MSVS 2008 c++中不可用,或者我不知道在哪里找到它。测试没有问题地运行。 - Doo Dah
@DooDah 听起来你的模块已经在“PYTHONPATH”中了。在Ubuntu上,如果没有setenv行,我无法从当前工作目录导入文件。 - Aya

0

你不能导入一个类,但是你可以导入一个文件或库(这在大多数语言中都是正确的吧?)- 这正是你在 test.py 的情况下所做的。


问题是如何将Python类导入到C++中。被标记为正确的答案就是解决方案。 - Doo Dah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接