homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vstinner
Recipients amaury.forgeotdarc, georg.brandl, techtonik, terry.reedy, vstinner
Date 2011年03月23日.09:25:10
SpamBayes Score 1.931233e-13
Marked as misclassified No
Message-id <1300872311.39.0.313704922804.issue11633@psf.upfronthosting.co.za>
In-reply-to
Content
amaury> When python is run from a console, sys.stdout is line buffered.
amaury> sys.stdout.write() flushes if there is a carriage return.
amaury> No need to change anything here.
Anatoly would like a flush after all calls to print().
> print() could call file.flush() if file.isatty(), *after* the multiple
> calls to file.write().
I vote +0 to change print(), call sys.stdout.flush(), if:
 - file option is not used (and so, sys.stdout is used)
 - sys.stdout is a TTY
 - end option is used (fast heuristic to check if print will write a newline or not, a better one whould be to check if end contains a newline character or not, but we had to check for \n and/or \r, for a little gain)
But I don't want to change print() for print(text, file=file), because it would make Python slower and print(... file=file) is not used to an interactive prompt or to display informations to the user.
> Behavior is same when pasting into interactive interpreter ...
> I presume interpreter flushes before or after printing next prompt.
Did you wrote all commands on the same line? Python does change stdout buffer in interactive mode:
------------
 if (Py_UnbufferedStdioFlag) {
#ifdef HAVE_SETVBUF
 setvbuf(stdin, (char *)NULL, _IONBF, BUFSIZ);
 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
 setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
#else /* !HAVE_SETVBUF */
 setbuf(stdin, (char *)NULL);
 setbuf(stdout, (char *)NULL);
 setbuf(stderr, (char *)NULL);
#endif /* !HAVE_SETVBUF */
 }
 else if (Py_InteractiveFlag) {
#ifdef MS_WINDOWS
 /* Doesn't have to have line-buffered -- use unbuffered */
 /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
 setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
#else /* !MS_WINDOWS */
#ifdef HAVE_SETVBUF
 setvbuf(stdin, (char *)NULL, _IOLBF, BUFSIZ);
 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
#endif /* HAVE_SETVBUF */
#endif /* !MS_WINDOWS */
 /* Leave stderr alone - it should be unbuffered anyway. */
 }
#ifdef __VMS
 else {
 setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
 }
#endif /* __VMS */
------------
(it doesn't check if stdout is a TTY or not, but I don't think that it is very useful to use the interactive mode outside a TTY)
> I have always experienced and expected Python's print to screen
> to be immediately visible. I thought that was pretty standard
> in other languages with a print-to-screen separate from
> general file-write.
Did you try Perl, Ruby, bash and other languages? I know that at least the C language requires an explicit call to fflush(stdout). I always used that.
> Terry, IDLE is completely different, its sys.stdout completely
> bypasses the new io stack, and there is no buffering...
As I wrote: "unbuffered mode" is not implemented for TextIOWrapper. So even with python3 -u, sys.stdout.write("abc") doesn't flush immediatly into the underlying FileIO.
History
Date User Action Args
2011年03月23日 09:25:11vstinnersetrecipients: + vstinner, georg.brandl, terry.reedy, amaury.forgeotdarc, techtonik
2011年03月23日 09:25:11vstinnersetmessageid: <1300872311.39.0.313704922804.issue11633@psf.upfronthosting.co.za>
2011年03月23日 09:25:10vstinnerlinkissue11633 messages
2011年03月23日 09:25:10vstinnercreate

AltStyle によって変換されたページ (->オリジナル) /