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