Python C API: T_INT не был объявлен в этой области - PullRequest
0 голосов
/ 25 апреля 2019

Я следую официальному руководству по Python API , чтобы создать простой тип расширения в C ++ для Python. Но я не могу получить успешно скомпилированный код. Потому что когда я использую T_INT в своем коде, я получаю сообщение об ошибке 'T_INT' was not declared in this scope Я что-нибудь забыл? Я не могу найти ответ в учебнике.

Вот мой код C ++:

#define PY_SSIZE_T_CLEAN
#include <python3.6/Python.h>
#include <stddef.h>

typedef struct {
    PyObject_HEAD
    int num;
} MyObject;

static PyMemberDef MyMembers[] = { 
    { "num", T_INT, offsetof(MyObject, num), 0, NULL },
    { NULL }
};

static PyTypeObject MyType = []{ 
    PyTypeObject ret = { 
        PyVarObject_HEAD_INIT(NULL, 0)
    };  
    ret.tp_name = "cpp.My";
    ret.tp_doc = NULL;
    ret.tp_basicsize = sizeof(MyObject);
    ret.tp_itemsize = 0;
    ret.tp_flags = Py_TPFLAGS_DEFAULT;
    ret.tp_new = PyType_GenericNew;
    ret.tp_members = MyMembers;
    return ret;
}();

static PyModuleDef moddef = []{ 
    PyModuleDef ret = { 
        PyModuleDef_HEAD_INIT
    };  
    ret.m_name = "cpp";
    ret.m_doc = NULL;
    ret.m_size = -1; 
    return ret;
}();

PyMODINIT_FUNC
PyInit_cpp(void)
{
    PyObject *mod;
    if (PyType_Ready(&MyType) < 0)
        return NULL;
    mod = PyModule_Create(&moddef);
    if (mod == NULL)
        return NULL;
    Py_INCREF(&MyType);
    PyModule_AddObject(mod, "My", (PyObject *)&MyType);
    return mod;
}

Я компилирую с помощью следующей команды:

g++ -std=c++11 -shared -fPIC -o cpp.so tt.cpp

И первая ошибка, которую я получил:

tt.cpp:10:11: error: 'T_INT' was not declared in this scope

Моя g++ версия 7.3.0

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Я думаю, что вы забыли добавить еще один оператор включения в ваш код.

Можете ли вы попробовать включить

#include "structmember.h"

в ваш код (возможно, вам нужнодля поиска заголовка), поскольку вы включили #include <python3.6/Python.h> в свой код, возможно, вам нужно сделать #include python3.6/structmember.h, а также есть другой ответ на несколько такой же вопрос здесь .

1 голос
/ 25 апреля 2019

Да, вы что-то забыли, в частности, второе из двух включенных в учебник:

#include "structmember.h"

Это тот, который обеспечивает T_INT. (Вы можете получить его в python3.6/structmember.h, глядя на ваш существующий импорт.)

...