C++ Python导入类; 呼叫方法

Doo*_*Dah 5 c++ python python-c-api

我使用的是Python 2.7.我不清楚如何在C++中嵌入Python,如下所示:http://docs.python.org/2.7/extending/embedding.html.

我在一个名为test.py的文件中有一个简单的python示例:

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

    def subtract(self, num1, num2):
        return num1 - num2
Run Code Online (Sandbox Code Playgroud)

从python,我会做这样的事情:

>>> from test import math
>>> m = math()
>>> a = m.add(1, 2)
>>> s = m.subtract(1, 2)
Run Code Online (Sandbox Code Playgroud)

我有一些C++代码的开头来做到这一点:

PyObject *pName, *pModule;
Py_Initialize();
pName = PyString_FromString("test");
pModule = PyImport_Import(pName);
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好.但是,这似乎相当于在Python中执行此操作:

import test
Run Code Online (Sandbox Code Playgroud)

如何导入Python类数学?

谢谢

Aya*_*Aya 11

这是C中的一个快速的例子,相当于......

>>> import mymath
>>> m = mymath.math()
>>> print '1 + 2 = %d' % m.add(1, 2)
Run Code Online (Sandbox Code Playgroud)

请注意,我已将模块重命名为test,mymath因为test在标准Python库中调用了一个模块.

#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;
}
Run Code Online (Sandbox Code Playgroud)

...输出......

$ gcc foo.c -lpython2.7 && ./a.out
1 + 2 = 3
Run Code Online (Sandbox Code Playgroud)

但是,如果您在Py_Initialize和之间使用Python/C API进行任何大量工作,则Py_Finalize必须查看引用计数,Py_INCREFPy_DECREF在适当时使用.