Создать конструктор Python с параметром из C ++, PyObject

У меня есть класс питона A как это.

class A:
def __init__(self, name):
self.name = name

def print_lastname(self, lastname):
print(lastname)

Я должен назвать этот код следующим образом.

import B
a = B.A("hello")
a.print_lastname("John")

В настоящее время мне нужно использовать это A класс из моего кода C ++. Я получил это далеко.

Py_Initialize();
string hello = "hello";
PyObject *module, *attr, *arg;
module = PyObject_ImportModule("B"); // import B
attr = PyObject_GetAttrString(module, "A"); // get A from B
arg = PyString_FromString(hello.c_str());
instance = PyInstance_New(attr, arg, NULL); // trying to get instance of A with parameter "hello"Py_Finalize();

Но я получаю ошибку

Исключение TypeError: ‘список аргументов должен быть кортежем’ в модуле ‘threading’ из ‘/usr/lib64/python2.7/threading.pyc’

Как я могу добиться от import заявление к a.print_name("John") из C ++?
Любая помощь приветствуется.

2

Решение

Я собираюсь немного переписать класс Python, чтобы он использовал и аргумент, и переменную-член.

# B.py - test module
class A:
def __init__(self, name):
self.name = name

def print_message(self, message):
print message + ' ' + self.name

Что касается C ++, почти все выглядит хорошо. Ошибка, которую вы получаете, потому что аргумент PyInstance_New должен быть кортежем Существует несколько способов вызова функций или методов. Вот полный пример с использованием одного из них:

// test.c - test embedding.
void error_abort(void)
{
PyErr_Print();
exit(EXIT_FAILURE);
}

int main(int argc, char* argv[])
{
PyObject* temp, * args, * attr, * instance;

Py_Initialize();
if (!(temp = PyString_FromString("John")))
error_abort();
if (!(args = PyTuple_Pack(1, temp)))
error_abort();
Py_DECREF(temp);

if (!(temp = PyImport_ImportModule("B")))
error_abort();
if (!(attr = PyObject_GetAttrString(temp, "A")))
error_abort();
Py_DECREF(temp);

if (!(instance = PyInstance_New(attr, args, NULL)))
error_abort();
if (!PyObject_CallMethod(instance, "print_message", "s", "Hello"))
error_abort();

Py_DECREF(args);
Py_DECREF(attr);
Py_DECREF(instance);
Py_Finalize();
return 0;
}

Для получения дополнительной информации см. Python чистое встраивание.

5

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

Других решений пока нет …

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