Python C API 和 C++ 函数

Posted

技术标签:

【中文标题】Python C API 和 C++ 函数【英文标题】:Python C API and C++ functions 【发布时间】:2013-11-03 17:31:04 【问题描述】:

我正在尝试在我的 C++ 程序中扩展 Python 解释器,我的问题如下。 当我试图调用一个函数时,在下面的代码中进行了解释,我从 Python 解释器中得到了一个NameError。 错误是

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

根据我在此处使用的 Python wiki 版本 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");
然而,我不断收到错误。有人可以解释一下,我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:
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) )

请注意,如果您还不熟悉如何编写 CPython C 扩展模块,我建议您使用 CFFI。

【讨论】:

【参考方案2】:

我同意 Armin Rigo 的所有修复,我会添加这个:PyImport_AppendInittab("test", &amp;PyInit_test);

将函数的地址传递给PyImport_AppendInittab

【讨论】:

以上是关于Python C API 和 C++ 函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言和C++的区别

如何使用 Boost Python 从 C++ bool 转换为 Python boolean?

有没有办法通过 C++ 中的 OUT 参数接收 Python 中的返回值?

C++多线程中调用python api函数

通过 C API 从字符串创建和调用 python 函数

通过 Boost Python 将 Python 函数转换为 C++,用作回调