Как перенести структуру структур C на python с помощью cpython

Я хочу передать структуру, содержащую структуры, в C на python, используя cpython.

//main.c
#include <Python.h>

struct properties {
  struct position
  double velocity;
}

struct position{
  double rx;
  double ry;
  double rz;
}

struct velocity{
  double vx;
  double vy;
  double vz;
}

void main(int argc, char** argv){
Py_Initialize();
struct properties pr;
position po = &pr.position;
velocity v = &pr.velocity;
_Py_fopen("f.py", "r+");
Py_Finalize();
}
#f.py
#import numpy as np
#pr = properties()
#po = pr.po
#v = pr.v
#poabs = np.abs(po.rx + po.ry + po.rz)

Как я могу манипулировать структурами в файле Python?

Единственный способ, который я могу придумать, - это передавать каждую переменную по отдельности,

//main.c
...
PyObject* rx = po.rx;
...

напишите методы получения для каждой переменной в соответствии с https://docs.python.org/3/extending/embedding.html (1.4.)

//main.c
static PyObject* emb_getrx(PyObject *self, PyObject *rx)
{
    return PyFloat_FromDouble(rx);
}

и внедрить каждый метод получения

//main.c
static PyMethodDef EmbMethods[] = {
    {"rx", emb_getrx, double, "Return rx."},
    {NULL, NULL, 0, NULL}
};

static PyModuleDef EmbModule = {
    PyModuleDef_HEAD_INIT, "emb", NULL, -1, EmbMethods,NULL, NULL, NULL, NULL
};

затем импортировать

#f.py
import emb

В реальном коде гораздо больше структур и переменных. Есть ли более простой способ?


person Michi    schedule 10.04.2020    source источник
comment
связанные чтение структуры в python из созданной структуры в c   -  person jfs    schedule 10.04.2020
comment
Основываясь на вашем main.c и предоставленной вами ссылке, похоже, что вы пытаетесь встроить Python в приложение C, а не создаете модуль расширения C для CPython. Это правильно?   -  person Brian    schedule 10.04.2020