diff --git a/osc-wrapper.py b/osc-wrapper.py index 4ceb7545..833729e5 100755 --- a/osc-wrapper.py +++ b/osc-wrapper.py @@ -23,8 +23,18 @@ except NameError: pass # avoid buffering output on pipes (bnc#930137) -if sys.stdout.name == '': - sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) +# Basically, a "print('foo')" call is translated to a corresponding +# fwrite call that writes to the stdout stream (cf. string_print +# (Objects/stringobject.c) and builtin_print (Python/bltinmodule.c)); +# If no pipe is used, stdout is a tty/refers to a terminal => +# the stream is line buffered (see _IO_file_doallocate (libio/filedoalloc.c)). +# If a pipe is used, stdout does not refer to a terminal anymore => +# the stream is fully buffered by default (see _IO_file_doallocate). +# The following fdopen call makes stdout line buffered again (at least on +# systems that support setvbuf - if setvbuf is not supported, the stream +# remains fully buffered (see PyFile_SetBufSize (Objects/fileobject.c))). +if not os.isatty(sys.stdout.fileno()): + sys.stdout = os.fdopen(sys.stdout.fileno(), sys.stdout.mode, 1) osccli = commandline.Osc()