C ++ Python класс импорта; вызывать методы

Я использую 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 ++, чтобы сделать это:

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

Это, кажется, работает просто отлично. Но это похоже на то, как это делается в Python:

import test

Как мне импортировать класс Python по математике?

Спасибо

4

Решение

Вот быстрый и грязный пример на C, который эквивалентен …

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

Обратите внимание, что я переименовал модуль из 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;
}

…какие выводы …

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

Тем не менее, если вы выполняете большую часть работы с Python / C API между Py_Initialize а также Py_Finalize, вам придется следить за вашими ссылками и использовать Py_INCREF а также Py_DECREF когда уместно.

9

Другие решения

Вы не можете импортировать класс, но вы можете импортировать файл или библиотеку (что верно для большинства языков?) — это именно то, что вы сделали здесь в случае test.py.

0

По вопросам рекламы [email protected]