]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-30404: The -u option now makes the stdout and stderr streams totally unbuffered...
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 4 Oct 2017 17:25:40 +0000 (20:25 +0300)
committerGitHub <noreply@github.com>
Wed, 4 Oct 2017 17:25:40 +0000 (20:25 +0300)
Doc/using/cmdline.rst
Lib/test/test_cmd_line.py
Misc/NEWS.d/next/Core and Builtins/2017-10-03-23-46-39.bpo-30404._9Yi5u.rst [new file with mode: 0644]
Python/pylifecycle.c

index 9c1c269d1dffb9d365d2fbf5c53f8c3b9424f6f0..7b60a9b71fef96d20242a8b74923a5817312d1b8 100644 (file)
@@ -303,13 +303,13 @@ Miscellaneous options
 
 .. cmdoption:: -u
 
-   Force the binary layer of the stdout and stderr streams (which is
-   available as their ``buffer`` attribute) to be unbuffered. The text I/O
-   layer will still be line-buffered if writing to the console, or
-   block-buffered if redirected to a non-interactive file.
+   Force the stdout and stderr streams to be unbuffered.
 
    See also :envvar:`PYTHONUNBUFFERED`.
 
+   .. versionchanged:: 3.7
+      The text layer of the stdout and stderr streams now is unbuffered.
+
 
 .. cmdoption:: -v
 
index 3e20427917345a52d3664c9e4f95829212c2ae69..28ddb2ba1bf223d89be348db9045e4e8601dc0de 100644 (file)
@@ -221,13 +221,12 @@ class CmdLineTest(unittest.TestCase):
             rc, out, err = assert_python_ok('-u', '-c', code)
             data = err if stream == 'stderr' else out
             self.assertEqual(data, b'x', "binary %s not unbuffered" % stream)
-            # Text is line-buffered
-            code = ("import os, sys; sys.%s.write('x\\n'); os._exit(0)"
+            # Text is unbuffered
+            code = ("import os, sys; sys.%s.write('x'); os._exit(0)"
                 % stream)
             rc, out, err = assert_python_ok('-u', '-c', code)
             data = err if stream == 'stderr' else out
-            self.assertEqual(data.strip(), b'x',
-                "text %s not line-buffered" % stream)
+            self.assertEqual(data, b'x', "text %s not unbuffered" % stream)
 
     def test_unbuffered_input(self):
         # sys.stdin still works with '-u'
diff --git a/Misc/NEWS.d/next/Core and Builtins/2017-10-03-23-46-39.bpo-30404._9Yi5u.rst b/Misc/NEWS.d/next/Core and Builtins/2017-10-03-23-46-39.bpo-30404._9Yi5u.rst
new file mode 100644 (file)
index 0000000..6c28020
--- /dev/null
@@ -0,0 +1,2 @@
+The -u option now makes the stdout and stderr streams unbuffered rather than
+line-buffered.
index 4b0383b4292df31bd0ef019f6404d50e59020f0a..5b13bc45822b2ad2acf899ccebe91a3e33257cd5 100644 (file)
@@ -1498,7 +1498,7 @@ create_stdio(PyObject* io,
     PyObject *buf = NULL, *stream = NULL, *text = NULL, *raw = NULL, *res;
     const char* mode;
     const char* newline;
-    PyObject *line_buffering;
+    PyObject *line_buffering, *write_through;
     int buffering, isatty;
     _Py_IDENTIFIER(open);
     _Py_IDENTIFIER(isatty);
@@ -1555,7 +1555,11 @@ create_stdio(PyObject* io,
     Py_DECREF(res);
     if (isatty == -1)
         goto error;
-    if (isatty || Py_UnbufferedStdioFlag)
+    if (Py_UnbufferedStdioFlag)
+        write_through = Py_True;
+    else
+        write_through = Py_False;
+    if (isatty && !Py_UnbufferedStdioFlag)
         line_buffering = Py_True;
     else
         line_buffering = Py_False;
@@ -1574,9 +1578,9 @@ create_stdio(PyObject* io,
     newline = "\n";
 #endif
 
-    stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssO",
+    stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssOO",
                                     buf, encoding, errors,
-                                    newline, line_buffering);
+                                    newline, line_buffering, write_through);
     Py_CLEAR(buf);
     if (stream == NULL)
         goto error;