On Sat, Apr 16, 2011 at 9:46 AM, Roger House <rho...@sonic.net> wrote: > I'm a Python newbie who's been given a task requiring calls of Python code > from a C++ program. I've tried various tutorials and dug into The Python/C > API doc and the Extending and Embedding Python doc, but I haven't been able > to answer this question: > > Is it possible in a C++ program to generate Python code, execute > it, and get output back (say a tuple of 10 or so items) without > doing any file i/o? > > Clearly it works to write the generated Python to a file and then use > PyImport_Import and PyObject_CallObject to call a function returning the > output tuple. But it seems like it should be possible to do this without > writing the Python code to a file. I tried PyRun_String, but I can't see > how it > can be used to return a tuple (the Py_file_input option always returns > None).
What I do for this is have the Python code place its return value into a particular location. If you're using file input, I think it's restricted to returning an integer; but you can do something like this: const char *python_code="result=('hello','world',42)"; PyObject *globals=... (use same as locals if you don't need globals) PyObject *locals=PyDict_New(); Py_XDECREF(PyRun_StringFlags(python_code,Py_file_input,globals,locals,0); PyObject *returned_tuple=PyDict_GetItemString(locals,"result"); Py_DECREF(locals); You now own a reference to whatever the Python code put into its variable "result", in the C variable returned_tuple. Of course, it might not be a tuple at all, and it might not even be present (in which case returned_tuple will be NULL). This is a fairly effective way for Python to return hefty amounts of data to C. Don't forget to decref the return value. Hope that helps! Chris Angelico -- http://mail.python.org/mailman/listinfo/python-list