[ Please help ] how to create Python functions in C++ at runtime &call them

G

grbgooglefan

I want to compile following type of python function in my C++ program
at runtime.
def isSizeSmall(size,vol,ADV,prod):
if ( (size < 1000) & (vol < (0.001 * ADV)) & (prod=="Stock")):
print "OK"; return 10
else: print "NOK"; return 11

Using Py_CompileString, I compiled a code object from this function,
like:
char szExpr[2048];
sprintf(szExpr,"def isSizeSmall(size,vol,ADV,prod):\n if ( (size <
1000) & (vol < (0.001 * ADV)) & (prod==\"Stock\")): print \"OK\";
return 10\n else: print \"NOK\"; return 11\n\n\n");

PyObject* result = Py_CompileString(szExpr,"<string>",
Py_file_input);

Then, I tried to call this function in 3 different ways: 1)
PyEval_EvalCode, 2) PyObject_CallObject.
But both failed.

For using PyObject_CallObject, I did something like this.

PyObject* tuple = PyTuple_New(4);
PyObject* val = 0;

val = PyInt_FromLong(ordval.size);
PyTuple_SetItem(tuple,0,val);

val = PyInt_FromLong(ordval.vol);
PyTuple_SetItem(tuple,1,val);

val = PyInt_FromLong(ordval.ADV);
PyTuple_SetItem(tuple,2,val);

val = PyString_FromString(ordval.prod);
PyTuple_SetItem(tuple,3,val);

PyObject *glb = PyDict_New();
PyDict_SetItemString(glb, "__builtins__", PyEval_GetBuiltins());

PyObject* func = PyFunction_New(result,glb);
if(!func || PyErr_Occurred()){
printf("Failed to get Function..\n");
PyErr_Print();
} else {
printf("Calling PyObject_CallObject\n");
if(PyCallable_Check(func))
printf("func is callable\n");
PyObject* ret = PyObject_CallObject(func, tuple);
if(!ret || PyErr_Occurred())
PyErr_Print();
else
printf("PyObject_CallObject evaluated..\n");
}

I got this output. Why is it so? Why is this function not taking any
parameters? Please help.

Expression to eval =
[def isSizeSmall(size,vol,ADV,prod):
if ( (size < 1000) & (vol < (0.001 * ADV)) & (prod=="Stock")): print
"OK"; return 10
else: print "NOK"; return 11

]
func is callable
TypeError: ?() takes no arguments (4 given)

Thanks for all help & guidance
 

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,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top