stdout/err and C extentions
Robert Bauck Hamar
roberth+news at ifi.uio.no
Tue Jun 12 16:10:44 EDT 2007
hg wrote:
> Robert Bauck Hamar wrote:
>
>> hg wrote:
>>
>>> Hi,
>>>
>>> I have the following
>>>
>>> ********************* C extention - redir.c
>>>
>>>
>>> #include "Python.h"
>>>
>>> PyObject * test_redir_test(PyObject *self) {
>>> fprintf(stdout, "Hello from an extention!\n");
>>> Py_INCREF(Py_None);
>>> return Py_None;
>>> }
>>>
>> [...]
>>> *********************** python test script: test.py:
>>> import sys
>>>
>>>
>>> class My_Stdout:
>>> def write(self, p_string):
>>> l_file = open('res.txt','a')
>>> l_file.write(p_string)
>>> l_file.close
>>>
>>>
>>> sys.stdout = My_Stdout()
>>>
>>> print 'toto'
>>> import test_redir
>>>
>>>
>>>
>>> test_redir.test()
>>>
>>>
>>>
>>> **************** Question:
>>>
>>> print 'toto' does go to "res.txt" while "Hello from an extention!\n"
>>> goes to the console.
>>>
>>> Any clue ?
>>
>> There is no portable way to change the location of stdout during
>> execution of a program. If you want to print with whatever is sys.stdout
>> from an extension module, you should call sys.stdout's write method
>> dynamically from C.
>>
>
> Robert, thanks,
>
> I understand that sys.stdout and stdout of an extention are two different
> entities ... correct ?
Yes. Python's sys.stdout and C's stdout are both objects wrapping the call
os.write(1, "string") in Python and write(1, "string", strlen("string")) in
C, or some other function on platforms using other mechanisms for output.
In that way sys.stdout in Python and stdout in C will be portable to many
more systems.
--
Robert Bauck Hamar
More information about the Python-list
mailing list