I was wondering how to go about having a redirect of stdout with Python take effect in a C extension. My python script redirects sys.stdout into a file handle created with open(...), but within the function in my compiled C-extension, any output (printf, puts, etc) is still given to the screen, and not the file object that the Python script invoking the extension is using.

Is there any good way to do this? The first thought in my head was to define a Python function that is passed a string and writes it to the file, and then pass that function into the C-extension as an argument. Then any output in C would be done via the passed-in function. Are there any proper ways of doing this?


7 Years
Discussion Span
Last Post by Gribouillis

I would try something like this

sys = PyImport_ImportModule( "sys");
s_out = PyObject_GetAttrString(sys, "stdout"); // new reference
result = PyObject_CallMethod(s_out, "write", "s", "your data goes here"); //new ref

that is to say, you execute sys.stdout.write("your data goes here") , but in C :). Don't forget to decref what must be decrefed. The pointer to sys can be computed only once, but if you intend to change sys.stdout, you should compute the attribute each time you want to print.

Edited by Gribouillis: n/a

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.