Python C API и функции C ++

Я пытаюсь расширить интерпретатор Python в моей программе C ++, моя проблема заключается в следующем.
Когда я пытаюсь вызвать функцию, описанную в коде ниже, я получаю NameErrorот интерпретатора Python.
Ошибка


Traceback (most recent call last):
File "", line 3, in module
NameError: name 'func' is not defined

Я использовал следующий код, чтобы связать его, согласно вики Python для версии 3.3.2, которую я использую здесь

double func( int a )
{
return a*a-0.5;
}

static PyObject *TestError;
static PyObject * func_test(PyObject * self, PyObject *args)
{
const int * command;
double sts;
if( !PyArg_ParseTuple(args, "i", &command) )
return NULL;
sts = func( *command );
return PyFloat_FromDouble(sts);
}

static PyMethodDef TestMethods[] = {
{"func",  func_test, METH_VARARGS,
"Thing."},
{NULL, NULL, 0, NULL}        /* Sentinel */
};

static struct PyModuleDef testmodule = {
PyModuleDef_HEAD_INIT,
"test",   /* name of module */
NULL, /* module documentation, may be NULL */
-1,       /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
TestMethods
};

PyMODINIT_FUNC PyInit_test()
{
PyObject *m;
m = PyModule_Create(&testmodule);
if (m == NULL)
return NULL;
TestError = PyErr_NewException("test.error", NULL, NULL);
Py_INCREF(TestError);
PyModule_AddObject(m, "error", TestError);
return m;
}

Тогда я звоню PyImport_AppendInittab("test", PyInit_test);
Py_Initialize();, а затем я пытаюсь запустить простой тест, с

    PyRun_SimpleString("import test\n""print('Hi!')\n""b = func(5)\n""print(b)\n");

Тем не менее, я продолжаю получать ошибку. Может кто-нибудь объяснить, пожалуйста, что я здесь делаю не так?

0

Решение

PyRun_SimpleString("import test\n""print('Hi!')\n""b = test.func(5)\n"   # <--
"print(b)\n");

РЕДАКТИРОВАТЬ: Еще одна проблема:

int command;   // not "int *"double sts;
if( !PyArg_ParseTuple(args, "i", &command) )

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

1

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

Я согласен со всеми исправлениями Армина Риго, и я бы добавил это:
PyImport_AppendInittab("test", &PyInit_test);

Передать адрес функции PyImport_AppendInittab,

0

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