diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-26 21:48:00 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-26 21:48:00 (GMT) |
commit | 27fe9fc448ed2669320e1b3e7e43c955137b980a (patch) | |
tree | ee48d0e81932b7521baeb14f91b714a32d1dc7f4 | |
parent | 0302cf50ebbaf3da5d5358bdfb5f61babb3f1c6f (diff) | |
download | cpython-27fe9fc448ed2669320e1b3e7e43c955137b980a.zip cpython-27fe9fc448ed2669320e1b3e7e43c955137b980a.tar.gz cpython-27fe9fc448ed2669320e1b3e7e43c955137b980a.tar.bz2 |
Followup of #4705: we can't skip the binary buffering layer for stdin because FileIO doesn't have a read1() method
-rw-r--r-- | Lib/test/test_cmd_line.py | 10 | ||||
-rw-r--r-- | Python/pythonrun.c | 9 |
2 files changed, 17 insertions, 2 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index e567184..77bd6bb 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -159,6 +159,16 @@ class CmdLineTest(unittest.TestCase): self.assertEqual(data.strip(), b'x', "text %s not line-buffered" % stream) + def test_unbuffered_input(self): + # sys.stdin still works with '-u' + code = ("import sys; sys.stdout.write(sys.stdin.read(1))") + p = _spawn_python('-u', '-c', code) + p.stdin.write(b'x') + p.stdin.flush() + data, rc = _kill_python_and_exit_code(p) + self.assertEqual(rc, 0) + self.assertEqual(data.strip(), b'x') + def test_main(): test.support.run_unittest(CmdLineTest) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 6819be5..65c6f5f 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -739,7 +739,12 @@ create_stdio(PyObject* io, PyObject *line_buffering; int buffering, isatty; - if (Py_UnbufferedStdioFlag) + /* stdin is always opened in buffered mode, first because it shouldn't + make a difference in common use cases, second because TextIOWrapper + depends on the presence of a read1() method which only exists on + buffered streams. + */ + if (Py_UnbufferedStdioFlag && write_mode) buffering = 0; else buffering = -1; @@ -753,7 +758,7 @@ create_stdio(PyObject* io, if (buf == NULL) goto error; - if (!Py_UnbufferedStdioFlag) { + if (buffering) { raw = PyObject_GetAttrString(buf, "raw"); if (raw == NULL) goto error; |