[Python-3000] print() flushing problem.

Wojciech Walczak wojtek.gminick.walczak at gmail.com
Sun Nov 11 18:40:05 CET 2007


2007/11/9, Guido van Rossum <guido at python.org>:

> Well, passing '1' as the buffer size to open() is supposed to set the
> buffer size to the default value (typically 8K) *and* set a special
> flag that forces a flush() whenever a line end is written.

As for now I can't even imagine how to implement the latter in Lib/io.py.
If anyone would like to do that or give me some advice on how to do that - that
would be great.
Anyway, isn't it easier to set the buffer size in Lib/io.py to
DEFAULT_BUFFER_SIZE whenever open() is passing '1' as the buffer size?
I mean changing these lines in Lib/io.py's open():
---[Lib/io.py:145-146]---
if buffering < 0 and raw.isatty():
   buffering = 1
------
into:
------
if buffering < 0 and raw.isatty():
   buffering = DEFAULT_BUFFER_SIZE
-------
...and then we can implement flush() whenever a line end is written (I
mean that print()s end parameter is set and is not empty string) in
builtin_print(). Code below is not a proposition for a patch. It is
rather proof of concept ;-)
---[Python/bltinmodule.c:1225]---
	if (end == NULL || end == Py_None)
		err = PyFile_WriteString("\n", file);
	else {
		err = PyFile_WriteObject(end, file, Py_PRINT_RAW);
                                  if(PyObject_Length(end) > 0) {
		     if(Py_InteractiveFlag) {
                                              err =
PyFile_WriteString("\n", file);
		     }
		     else {
		         tmp = PyObject_CallMethod(file, "flush", "");
		         if (tmp == NULL)
			PyErr_Clear();
		         else
			Py_DECREF(tmp);
		     }
		 }
	}
------------

To make it work I had to change Python/pythonrun.c to make sure that
it sets Py_InteractiveFlag when python works in interactive mode. I
have added that line:

Py_InteractiveFlag = 1;

to PyRun_InteractiveLoopFlags(). I find it arguable if this is the
best place ;-)

Regards,
Wojtek Walczak


More information about the Python-3000 mailing list