Is it possible to execute Python code from C++ without writing to a file?

Chris Angelico rosuav at gmail.com
Sat Apr 16 02:32:55 CEST 2011


On Sat, Apr 16, 2011 at 9:46 AM, Roger House <rhouse at 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



More information about the Python-list mailing list