embedding a new method

J

J

Hi everyone,


I am fairly new to python (3rd day), but i am fairly keen on
replacing javascript. I want to externalize some of the mehtod
in my App, an allow user to imp

char* lBuffer = "def handler(color):\n"
" print 12"

PyObject* lCode = Py_CompileString(lBuffer, "<Object>",
Py_file_input);
if (lCode)
{
mFunction = PyFunction_New(lCode, ScnGlobal::sDictionary);
Py_XDECREF(lCode);
}
else
{
PyErr_Print();
}

So far, there is no error, but I am wondering if that function object
knows about the signature of the function at this point.
Next I am defining an class like


PyType_Ready(&PyType);
Py_INCREF(&PyType);
PyModule_AddObject(ScnGlobal::sModule, "Place",
(PyObject*)&PyType);

where PyType is pretty much taken out of the "embedding tutorial",
and ScnGlobal::sModule is the result of the call to
PyImport_ImportModule ("__main__"). I am installing tp_init and tp_new
in PyType.

Next, I instantiate an object of PyType like

PyObject* new_args = PyTuple_New(0);
mPyObject = (PyStruct*) PyObject_Call((PyObject*)&PyType, new_args,
0);

This also works and tp_init and tp_new get called. Now, I want to add
the new mehtod to this instance, and not the class, so I call


PyObject* lParam = PyMethod_New(mFunction, (PyObject*)mPyObject,
(PyObject*)&PyType);
if (lParam)
{
Py_XDECREF(lParam);
}
else
{
PyErr_Print();
}

This call also returns an object. The problem starts when I try to
call the new method like so

PyObject* lObject = PyObject_CallMethod((PyObject*)mPyObject,
"handler", "", NULL);

if (lObject)
{
Py_DECREF(lObject);
}
else
{
PyErr_Print();
}

This when I get an error saying "AtrributeError:handler". I would
really appreciate some help on this. Here is also what the PyType
structure looks like


PyTypeObject CmdPlace::pyType =
{
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"Place", /*tp_name*/
sizeof(CmdPlace::pyStruct), /*tp_basicsize*/
0, /*tp_itemsize*/
0, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash */
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
"CmdPlace", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
CmdPlace::sPyMethods, /* tp_methods */
0, /* tp_members */
CmdPlace::sPyGetSeters, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)CmdPlace::sPyInit, /* tp_init */
0, /* tp_alloc */
CmdPlace::sPyNew, /* tp_new */
};


I hopesome has an answer. I have been stuck with this for a while.


Cheers
Jochen
 
J

J

If your are reading this, I am sorry but I forgot to finish the first
paragraph.... :(. I am
trying to externalize some methods of a C++ object using python. User
will be
able to implement the function via the GUI and I then would like to add
it to an instance... So the class consits of both python and c++
methods...

Cheers
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,829
Messages
2,569,737
Members
45,525
Latest member
RosalindSa

Latest Threads

Top