Please help in creating Python function in C ++ program
gagsl-py2 at yahoo.com.ar
gagsl-py2 at yahoo.com.ar
Thu Nov 22 02:06:53 EST 2007
Forwarded to python-list at python.org
--- "Borse, Ganesh" <ganesh.borse at credit-suisse.com>
escribió:
> Hi,
>
> I am new to Python. I would like to use Python for
> the specialized purpose of dynamic expressions
> parsing & evaluation in my C++ application.
> I would like to encapsulate the expressions to be
> evaluated in Python function & compile that function
> at runtime, somewhat as below.
> Expression to eval put in Python function
> def isSizeSmall(size,vol,ADV,prod):
> if ( (size < 1000) & (vol < (0.001 * ADV)) &
> (prod=="Stock")): print "OK"; return 10
> else: print "NOK"; return 11
>
> Then, I want to evaluate the PyObject returned by
> Py_CompileString multiple times in my program using
> the user input as the variables to the above
> function.
> This I tried using two different approaches - 1)
> PyEval_evalCode, & 2) PyObject_CallObject.
>
> 1) When using PyEval_evalCode: The function call to
> PyEval_evalCode was ok, but it did not return any
> output.
> 2) Whereas, when I used this object with
> PyObject_CallObject, it failed with error as "".
>
> Any help will be great. Many thanks in advance for
> your help.
>
> Warm Regards,
> Ganesh
>
> //***********************************************//
> Output of my test program:
> 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
>
> ]
> str compiled fine with stdin & Py_file_input,
> calling PyEval_EvalCode
> None ok [0] size [-1]
>
> str compiled fine with stdin & Py_file_input,
> calling PyFunction_New & then PyObject_CallObject
> Getting PyFunction_New
> Calling PyObject_CallObject
> func is callable
> TypeError: ?() takes no arguments (4 given)
>
> My test program having both above approaches is as
> below:
> main(int argc, char **argv)
> {
> /* Pass argv[0] to the Python interpreter */
> Py_SetProgramName(argv[0]);
> /* Initialize the Python interpreter. Required.
> */
> Py_Initialize();
> PyRun_SimpleString("import sys\n");
>
> char szExpr[2048];
> memset(szExpr,'\0',sizeof(szExpr));
> 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");
>
> printf("Expression to eval = \n[%s]\n",szExpr);
>
> OrderValues ordval;
> ordval.size = 100;
> ordval.ADV = 100000;
> ordval.vol = 1000;
> memset(ordval.prod,'\0',sizeof(ordval.prod));
> sprintf(ordval.prod,"Stock");
>
>
> PyObject *glb, *loc;
>
> glb = PyDict_New();
> PyDict_SetItemString(glb, "__builtins__",
> PyEval_GetBuiltins());
>
> loc = PyDict_New();
>
> PyObject* tuple = PyTuple_New(4);
> PyObject* val = 0;
>
> val = PyInt_FromLong(ordval.size);
> PyTuple_SetItem(tuple,0,val);
> PyDict_SetItemString(loc,"size",val);
>
> val = PyInt_FromLong(ordval.vol);
> PyTuple_SetItem(tuple,1,val);
> PyDict_SetItemString(loc,"vol",val);
>
> val = PyInt_FromLong(ordval.ADV);
> PyTuple_SetItem(tuple,2,val);
> PyDict_SetItemString(loc,"ADV",val);
>
> val = PyString_FromString(ordval.prod);
> PyTuple_SetItem(tuple,3,val);
> PyDict_SetItemString(loc,"prod",val);
>
>
> /*** with string & Py_file_input ***/
> PyObject* result = NULL;
> result = Py_CompileString(szExpr,"<string>",
> Py_file_input);
> if(result!=NULL && !PyErr_Occurred()){
> printf("str compiled fine with stdin &
> Py_file_input, calling PyEval_EvalCode\n");
>
> PyCodeObject *pyCo = (PyCodeObject *)result;
> PyObject* evalret = NULL;
> evalret = PyEval_EvalCode(pyCo,glb,loc);
> if(!evalret || PyErr_Occurred())
> PyErr_Print();
> else
> printf("ok [%d] size
>
[%d]\n",PyObject_Print(evalret,stdout,0),PyObject_Size(evalret));
>
> // Try to get function obj of this...
> printf("Getting PyFunction_New\n");
> 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);
> //PyObject* ret = PyObject_CallObject(func,
> NULL);
> if(!ret || PyErr_Occurred())
> PyErr_Print();
> else
> printf("PyObject_CallObject
> evaluated..\n");
> }
> } else {
> printf("Py_CompileString-1 returned
> NULL\n");
> PyErr_Print();
> }
> exit(100);
> }
Remember that when you execute the Python source code,
you get the function *definition*; you are not
executing the function itself.
I travel until Dec. so unfortunately I can't provide
more help now. See the docs for Extending and
Embedding.
--
Gabriel Genellina
Gabriel Genellina
Softlab SRL
Compartí video en la ventana de tus mensajes (y también tus fotos de Flickr).
Usá el nuevo Yahoo! Messenger versión Beta. http://ar.beta.messenger.yahoo.com/
More information about the Python-list
mailing list