Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

unbuffered stdout in python (as in python -u) from within the program [duplicate]

Tags:

python

Is there any way to get the effect of running python -u from within my code? Failing that, can my program check if it is running in -u mode and exit with an error message if not? This is on Linux (Ubuntu 8.10 Server).

like image 454
Martin DeMello Avatar asked May 19 '09 09:05

Martin DeMello


3 Answers

The best I could come up with:

>>> import os
>>> import sys
>>> unbuffered = os.fdopen(sys.stdout.fileno(), 'w', 0)
>>> unbuffered.write('test')
test>>> 
>>> sys.stdout = unbuffered
>>> print 'test'
test

Tested on GNU/Linux. It seems it should work on Windows too. If I knew how to reopen sys.stdout, it would be much easier:

sys.stdout = open('???', 'w', 0)

References:
http://docs.python.org/library/stdtypes.html#file-objects
http://docs.python.org/library/functions.html#open
http://docs.python.org/library/os.html#file-object-creation

[Edit]

Note that it would be probably better to close sys.stdout before overwriting it.

like image 167
Bastien Léonard Avatar answered Sep 28 '22 10:09

Bastien Léonard


You could always pass the -u parameter in the shebang line:

#!/usr/bin/python -u
like image 44
mikewaters Avatar answered Sep 28 '22 11:09

mikewaters


Assuming you're on Windows:

msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

... and on Unix:

fl = fcntl.fcntl(sys.stdout.fileno(), fcntl.F_GETFL)
fl |= os.O_SYNC
fcntl.fcntl(sys.stdout.fileno(), fcntl.F_SETFL, fl)

(Unix copied in from commented solution, rather than linking.)

like image 34
RichieHindle Avatar answered Sep 28 '22 12:09

RichieHindle