Please help in creating Python function in C ++ program
Borse, Ganesh
ganesh.borse at credit-suisse.com
Thu Nov 22 04:45:54 EST 2007
Hi,
Yes I agree. After compile() this is "*definition*" of that function.
I would like to know, how can we use this code object & call it as a function?
May be - how do we convert this Code Object to Function Object to work as Callable Object?
Thanks & Regards
Ganesh
-----Original Message-----
From: gagsl-py2 at yahoo.com.ar [mailto:gagsl-py2 at yahoo.com.ar]
Sent: 22 November 2007 15:07
To: Borse, Ganesh
Cc: python-list at python.org
Subject: Please help in creating Python function in C ++ program
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/
==============================================================================
Please access the attached hyperlink for an important electronic communications disclaimer:
http://www.credit-suisse.com/legal/en/disclaimer_email_ib.html
==============================================================================
More information about the Python-list
mailing list