How to access C variables in Python code object generated by Py_C ompileString
Borse, Ganesh
ganesh.borse at credit-suisse.com
Tue Nov 20 04:48:07 EST 2007
Hi,
May you please help in using Py_CompileString & PyEval_EvalCode to parse+compile an expression at startup & evaluate that multiple times at runtime.
I want to use this in C++ program as below.
Here, the expression contains the variables like size, vol, ADV, etc. The values of these variables keep on changing for every user input in C++ program.
The problem I am facing is that, I am not able to pass these values from C++ code to Python code, when calling PyEval_EvalCode.
Can you please guide me about my following queries:
1) how can I make these variables in C++ to be available to Python compiled code at runtime?
2) my this code got compiled but when running, I got an error from Py_CompileString, as below. Why is it so?
File "<string>", line 1
if ( (size < 1000) & (vol < (0.001 * ADV)) & (prod=="Stock")): print "OK"
^
SyntaxError: invalid syntax
But when I executed the same code in python process, it worked fine.
3) Is this correct use of Py_CompileString, PyEval_EvalCode & Py_BuildValue functions?
Please help, guide.
Many thanks in advance.
Regards,
Ganesh
//-----------------------------------------------------
#include "Python.h"
#include "compile.h"
#include "eval.h"
#include "object.h"
#include <stdio.h>
typedef struct {
long size;
long ADV;
long vol;
char prod[128];
} OrderValues, *pOrderValues;
main()
{
Py_SetProgramName("MyPyEval");
Py_Initialize();
PyRun_SimpleString("import sys\n");
/** Expression to parse in Python syntax:
if ( (size < 1000) & (vol < (0.001 * ADV)) & (prod=="Stock")) :
print "OK"
else
print "NOK"
**/
char szExpr[1024];
memset(szExpr,'\0',sizeof(szExpr));
sprintf(szExpr," if ( (size < 1000) & (vol < (0.001 * ADV)) & (prod==\"Stock\")): print \"OK\" \nelse: print \"NOK\" \n");
// Parse & compile this expression at startup & store the code object
PyObject* co = Py_CompileString(szExpr,"<string>",Py_eval_input);
if(pyco == NULL){
Py_Finalize();
exit(0);
}
PyCodeObject *pyCo = (PyCodeObject *)co;
// Expression parsed & compiled ok, evaluate it multiple times
PyObject *glb;
glb = PyDict_New();
PyDict_SetItemString(glb, "__builtins__", PyEval_GetBuiltins());
while(1){
// These values change at runtime as per user input
// Here only one set of values are shown for simplicity
OrderValues ordval;
ordval.size = 100;
ordval.ADV = 100000;
ordval.vol = 1000;
memset(ordval.prod,'\0',sizeof(ordval.prod));
sprintf(ordval.prod,"Stock");
PyObject* vals = Py_BuildValue("(llls)",pVals->size,pVals->vol,pVals->ADV,pVals->prod);
PyEval_EvalCode(pyCo,glb,vals);
}
Py_Finalize();
}
//-----------------------------------------------------
==============================================================================
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