By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
449,196 Members | 1,682 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 449,196 IT Pros & Developers. It's quick & easy.

[help request] how to set sys.stderr to object of cStringIO type

P: n/a
I am in a perculiar situation. I want to use PyRun_SimpleString for
creating Python functions in embedded Python in C++.
But there could be cases when Python function code compilation could
fail & PyRun_SimpleString will return -1 as return status. At this
time, it prints the error message to sys.stderr.
So, we do not have any control or cannot use that message to show to
user to correct the errors in the function code.
I could assign an object of cStringIO type to sys.stderr at Python
command prompt as below:
>>import sys
import cStringIO
obj=cStringIO.StringIO()
sys.stderr=obj
And then using the obj.getvalue(), I could print exceptions printed to
sys.stderr.

But, I am not able to figure out, how can I do this same thing in
Python/C API in my program using Py* functions?

How do we set the "sys.stderr" to cStringIO object from Python
embedded in C++ or C?

Should I be using PyFile_FromFile for convert the cStringIO object?
Please help.
Jan 15 '08 #1
Share this Question
Share on Google+
1 Reply


P: n/a
On Jan 15, 5:45*pm, grbgooglefan <ganeshbo...@gmail.comwrote:
I am in a perculiar situation. I want to use PyRun_SimpleString for
creating Python functions in embedded Python in C++.
But there could be cases when Python function code compilation could
fail & PyRun_SimpleString will return -1 as return status. At this
time, it prints the error message to sys.stderr.
So, we do not have any control or cannot use that message to show to
user to correct the errors in the function code.
I could assign an object of cStringIO type to sys.stderr at Python
command prompt as below:
>import sys
import cStringIO
obj=cStringIO.StringIO()
sys.stderr=obj

And then using the obj.getvalue(), I could print exceptions printed to
sys.stderr.

But, I am not able to figure out, how can I do this same thing in
Python/C API in my program using Py* functions?

How do we set the "sys.stderr" to cStringIO object from Python
embedded in C++ or C?

Should I be using PyFile_FromFile for convert the cStringIO object?
Please help.
I have got a solution for this. Would like to know if this is the
correct way or will it cause any problems if program runs for long
time?

/************************************************** */
/--1st stage is assign object of cStringIO to sys.stderr at
initialization
/-- once that is done, we can call getvalue() on that object on every
error.
/-----------------------------------------------------/
PyObject *_pPyobStringIO;
PyObject *_pPyGetValFunc;
_pPyobStringIO=NULL;
_pPyGetValFunc=NULL;
PyObject *obFuncStringIO = NULL;
int ret1 = 0;

// Import cStringIO module
PyObject * modStringIO = PyImport_ImportModule("cStringIO");
if(PyErr_Occurred() || modStringIO == NULL){
printf("pyParserEvaluator::Init::PyImport cStringIO
failed:");
PyErr_Print();
goto PY_INIT_ERR;
}
// get StringIO constructor
obFuncStringIO = PyObject_GetAttrString(modStringIO,
"StringIO");
if(PyErr_Occurred() || obFuncStringIO == NULL){
printf("pyParserEvaluator::Init: cant find
cStringIO.StringIO:");
PyErr_Print();
goto PY_INIT_ERR;
}
// Construct cStringIO object
_pPyobStringIO = PyObject_CallObject(obFuncStringIO, NULL);
if(PyErr_Occurred() || _pPyobStringIO==NULL){
printf("pyParserEvaluator::Init: cStringIO.StringIO()
failed:");
PyErr_Print();
goto PY_INIT_ERR;
}
// get the getvalue function ptr
_pPyGetValFunc = PyObject_GetAttrString(_pPyobStringIO,
"getvalue");
if(PyErr_Occurred() || _pPyGetValFunc==NULL){
printf("pyParserEvaluator::Init: cant find getvalue
function:");
PyErr_Print();
goto PY_INIT_ERR;
}
// try assigning this object to sys.stderr
ret1 = PySys_SetObject("stderr", _pPyobStringIO);
if(ret1 != 0){
printf("failed to assign _pPyobStringIO to stderr\n");
} else
printf("assigned _pPyobStringIO to stderr\n");
PY_INIT_ERR:
printf("pyParseEvaluator::pyParseEvaluator failed\n");
/
************************************************** ********************/
int ret = PyRun_SimpleString(strFunction);
if(ret != 0){
// call getvalue() method in StringIO instance
PyObject *obResult=NULL;
obResult = PyObject_CallObject(_pPyGetValFunc, NULL);
if(PyErr_Occurred() || obResult==NULL){
printf("getvalue() failed\n");
return -1;
} else printf("PyObject_CallObject on getvalue is ok\n");
// did getvalue return a string?
if(!PyString_Check(obResult)){
printf("getvalue() did not return error string\n");
return -1;
} else printf("getvalue returned string object\n");
// retrieve error message string from this object
char *sresult = NULL;
if(NULL != (sresult = PyString_AsString(obResult))){
printf("result string was [%s]\n",sresult);
}
}
/************************************************** ********/
Jan 15 '08 #2

This discussion thread is closed

Replies have been disabled for this discussion.