Выбор типа расширения Python, определенного как структура C, имеющая члены PyObject * - PullRequest
4 голосов
/ 13 мая 2011

Я запускаю код C ++ через Python и хотел бы выбрать тип расширения.

Итак, у меня есть структура C ++ (py_db_manager), содержащая указатели на объект базы данных и объект менеджера объектов (оба написаны на C ++), что я обернул с объектом типа Python (t_db_manager).Моя проблема заключается в том, что этот тип Python должен знать, как выбрать два указателя, чтобы отправить его некоторым дочерним многоядерным процессам.Таким образом, я зарегистрировал тип с помощью модуля copy_reg (это эквивалентно написанию метода redu () для типа. Однако я не слишком уверен, что в него вставить. Должен ли я создать кортеж сPyObject * или просто целочисленные указатели? Кто-нибудь может помочь?

typedef struct
{
  PyObject_HEAD
  PyObject* man_inst_ ;
  PyObject* db_inst_ ;

}py_db_manager;`

Вот Py_TypeObject

PyTypeObject t_db_manager = {
    PyObject_HEAD_INIT(0)               /* tp_head */
    0,                                  /* tp_internal */
    ".py_db_manager",                  /* tp_name */
    sizeof(py_db_manager)};

А вот код, который будет в уменьшить метод:

PyObject *pickle_manager(PyObject *module, PyObject *args)
{
    py_db_manager *cpp_manager =0;
    PyObject *values = NULL,
        *tuple = NULL;
    char text[512];

    if (!PyArg_ParseTuple(args, "O!", &t_db_manager, &cpp_manager))
        goto error;
    sprintf(text,"man_inst_, db_inst_");
    if ((values = Py_BuildValue("(sii)", text,
                                cpp_manager->man_inst_, cpp_manager->db_inst_)) == NULL)
        goto error;
    tuple = Py_BuildValue("(OO)", manager_constructor, values);

error:
    Py_XDECREF(values);
    return tuple;
}

1 Ответ

1 голос
/ 14 мая 2011

Поскольку это будет передано другому процессу , выборка только целочисленных указателей не будет работать так, как вы бы этого хотели.Разные процессы используют разное пространство памяти, поэтому они не видят одно и то же.

Итак, чтобы ответить на ваш вопрос, вы должны выбрать целые объекты и восстановить их с принимающей стороны.

...