Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将单个PyObject(在C+;+;后端创建)传递给嵌入式Python解释器?_Python_C++_C - Fatal编程技术网

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

如何将单个PyObject(在C+;+;后端创建)传递给嵌入式Python解释器?,python,c++,c,Python,C++,C,您好,我正在编写一个新的Python类型,定义如下: typedef struct { PyObject_HEAD /* Type-specific fields go here. */ int * value } Noddy; 我还定义了所需的所有其他方法和属性,如中所述: 问题是,我可以在Python中创建和使用我的新对象,没有任何问题,但是当我试图在C中创建对象时,我无法传输到Python解释器。我在C++中使用后端,Python是嵌入的,然后扩展(扩展嵌入式P

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

typedef struct 
{
    PyObject_HEAD
    /* Type-specific fields go here. */
    int * value
} Noddy;
我还定义了所需的所有其他方法和属性,如中所述:

问题是,我可以在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);

您需要像这样调用PyObject\u CallMethodObjArgs

pValue = PyObject_CallMethodObjArgs(VM, pFunc, pNoddy, NULL);
从文档中:

PyObject*PyObject\u CallMethodObjArgs(PyObject*o,PyObject*name,…,NULL)

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