Advertisement

Embedding Python, how to get the return value?

Started by April 24, 2003 08:59 PM
2 comments, last by CoffeeMug 21 years, 7 months ago
I am writing a small test app that embeds a Python interpreter. In the C++ code I get input from the user, then pass it to the interpreter that executes it. I then check for an error and print it if it occurred, and go back to asking for the user''s input again. Here''s a small example:
  
string input;
while(1)
{
	cin >> input;
	PyRun_SimpleString((char*)input.c_str());
	if(PyErr_Occurred() != NULL)
		PyErr_Print();
}
  
I have a few simple questions. 1. When calling PyErr_Print() is there a way to redirect it to a different output? Perhaps there is a similar function that returns an error in a string? 2. Some more advanced PyRun_* functions return a PyObject* which is a result of the operation. However, since the statement is typed by the user, I have no idea what datatype the returned PyObject wraps. I would like to print the value of the returned object on the screen. Is there something similar to a ToString() function that I could use regardless of what PyObject wraps?
Redirecting PyErr_Print, as far as I know, can only be done by overriding sys.stderr. Just create a python object that has a write method, and overwrite sys.stderr with it. (sys.stdout too, if you like)

"toString" is implemented as the Python str() function. On the C end, it''s called PyObject_Str. PyObject_Repr is essentially the same, but uses the __repr__ method of the object instead. It''s the same as `blah` in Python.


  PyObject* theObject;PyObject* theString = PyObject_Str(theObject);assert(theString != 0);char* str = PyString_AsString(theString);Py_DECREF(theString);// use str here  


(I''m just winging it here, I''ve never needed PyObject_Str() before)
"There is only one everything"
Advertisement
Thanks. Most of it is chinese to me (note, I don''t speak chinese ), but I''ll get there. Thanks again for the starting point.
you normally print an object in python like:

  >>>a = 5>>>print a5>>>#or even>>>a5  


print a calls a.__repr__()

in your own classes, to make them print nicely you can define __repr__ and it will be used by print.


  >>> class test:...     def __repr__(self):...         return "I am a test"...     >>> a = test()>>> print aI am a test>>> aI am a test>>>  

This topic is closed to new replies.

Advertisement