如何将单个PyObject(在C ++后端中创建)传递给嵌入式Python解释器?

时间:2014-05-13 09:20:51

标签: python c++ c

您好我正在编写一个新的Python类型,如下所示:

typedef struct 
{
    PyObject_HEAD
    /* Type-specific fields go here. */
    int * value
} Noddy;

我还定义了所需的所有其他方法和属性,如:https://docs.python.org/2/extending/newtypes.html中所述。

问题是我可以毫无问题地在Python中创建和使用我的新对象,但是当我尝试在C中创建对象时,我无法转移到Python解释器。我正在使用C ++中的后端,并嵌入Python然后进行扩展(扩展嵌入式python)以提供进一步的脚本功能。

重点是我创建PyObject时:

PyObject * pNoddy;
// Create Object
pNoddy= _PyObject_New(&pynoddy_PyNoddyType);
// Initialize Object.
pNoddy= PyObject_Init(pNoddy, &pynoddy_PyNoddyType);

现在在pNoddy上我有一个之前定义的类型的PyObject。我想将它加载到我的Python解释器上。为此,我尝试了以下代码,但它崩溃了。

PyObject *pValue, *pFunc;
// ("addNoddy") is a function defined in Python.
pFunc = PyString_FromString("addNoddy");
// VM is the main module of my system. pNoddy is the PyObject.
pValue = PyObject_CallMethodObjArgs(VM, pFunc, pNoddy);
/********************* NEVER REACH THIS POINT **********************/
Py_DECREF(pValue);

1 个答案:

答案 0 :(得分:2)

你需要像这样调用PyObject_CallMethodObjArgs

pValue = PyObject_CallMethodObjArgs(VM, pFunc, pNoddy, NULL);

来自文档:

  

PyObject * PyObject_CallMethodObjArgs(PyObject * o,PyObject * name,...,NULL)

     

返回值:新参考。调用对象o的方法,其中方法的名称作为名称中的Python字符串对象给出。它   使用可变数量的PyObject *参数调用。争论   作为可变数量的参数提供,后跟NULL 。   返回成功时调用的结果,或失败时返回NULL。