Issue 5505: sys.stdin.read() doesn't return after first EOF on Windows (original) (raw)

Created on 2009-03-18 09:20 by r_mosaic, last changed 2022-04-11 14:56 by admin. This issue is now closed.

Messages (19)
msg83736 - (view) Author: Fan Decheng (r_mosaic) Date: 2009-03-18 09:20
Platform: Windows Vista x64 Python version: 3.0.1 x64 When I use sys.stdin.readlines(), it correctly ends when I enter ^Z (ctrl-Z) on the console (this is the EOF on the console). However when I call sys.stdin.read(), it doesn't end when ^Z is entered. It ends when I enter the second ^Z. Repro steps: 1. Open python. 2. Type: import sys sys.stdin.read() 3. Type: Hello ^Z 4. Note the above ^Z should be followed by a Return. Result: The function call doesn't end. If I enter another ^Z, it ends. Expected result: The function call ends.
msg83742 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2009-03-18 10:51
(cannot reproduce under Linux)
msg83755 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-03-18 16:47
I can reproduce this on coLinux(debian). But coLinux is running on windows, so its console behavior may not be same as native linux. (You need to use Ctrl+D on coLinux instead of Ctrl+Z)
msg83756 - (view) Author: Hirokazu Yamamoto (ocean-city) * (Python committer) Date: 2009-03-18 16:55
With following patch for investigation, (release30-maint) Index: Lib/io.py =================================================================== --- Lib/io.py (revision 70450) +++ Lib/io.py (working copy) @@ -57,6 +57,7 @@ import os import abc +import sys import codecs import _fileio # Import _thread instead of threading to reduce startup cost @@ -931,6 +932,7 @@ while True: # Read until EOF or until read() would block. chunk = self.raw.read() + print("============>", repr(chunk), file=sys.stderr) if chunk in empty_values: nodata_val = chunk break /////////////////////// I got this result. >>> sys.stdin.read() abc ^Z ============> b'abc\n' ^Z ============> b'' 'abc\n' To get empty chunk, we need to hit CTRL-Z twice.
msg84145 - (view) Author: Fan Decheng (r_mosaic) Date: 2009-03-25 07:33
Perhaps using just one read() is enough? I mean perhaps no loop is necessary?
msg84166 - (view) Author: (cassava) Date: 2009-03-25 20:49
This is happening on Arch Linux as well: Python 3.0.1 (r301:69556, Feb 22 2009, 02:43:30) [GCC 4.3.3] on linux2 I tried python2.6 and it ends with one Ctrl+D I tried python3.0.1 and it needs two Ctrl+D before it ends
msg91154 - (view) Author: Martin (famart) Date: 2009-07-31 21:38
Looks like python needs eof() or something for file objects, just like any other languages. Since read() is using the system call, that's the right behavior: read() blocks until EOF, and returns whatever was buffered. EOF character is consumed, but since it's a stdin, it is never closed. The next read() will again wait for normal input. The 2nd EOF mark without anything in-between will return an empty string.
msg91296 - (view) Author: Gabriel Genellina (ggenellina) Date: 2009-08-05 02:13
This is a duplicate of #1633941
msg139994 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-07-07 21:08
I am still able to reproduce the problem with Python 3.2.1RC1 (64 bits) on Windows Seven, but not on Python 3.3 (alpha) compiled myself (using Visual C++ Express 2008). I don't know if something changed in Python 3.3, or it is related to how I compiled Python? I don't think that it is related to issue #12016 because Python 3.2.1RC1 contains the fix for #12016.
msg139995 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-07-07 21:37
> I don't know if something changed in Python 3.3, or ... Yes, something changed in Python 3.3. I fixed this issue "by mistake" :-) The fix is the following commit: New changeset 3c7792ec4547 by Victor Stinner in branch 'default': Issue #12175: BufferedReader.read(-1) now calls raw.readall() if available. http://hg.python.org/cpython/rev/3c7792ec4547 It is a bug in BufferedReader, a bug or an unexpected behaviour. Before this commit (e.g. in Python 3.2.0), BufferedReader.read(-1) calls raw.read() two times for this issue: the first call returns an non empty string (the string until the first ^Z), the second call returns an empty string (the string until the second ^Z). BufferedReader.read(-1) loop ends with raw.read() returns an empty string. You can workaround this issue by calling sys.stdin.buffer.raw.readall() or sys.stdin.buffer.raw.read(-1). I chose to not port my BufferedRead.read(-1) fix (call raw.readall() if available) in Python 3.2 because it changes the behaviour, and I don't want to do that in a minor release. Is anyone in favor of changing the behaviour of BufferedRead.read(-1) in a minor release (next 2.7.3 and 3.2.2)? Or can I close the issue (the bug is already fixed in Python 3.3)?
msg140322 - (view) Author: Matt Joiner (anacrolix) Date: 2011-07-14 04:42
I get this on Linux with ^D
msg140326 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-07-14 10:44
> I get this on Linux with ^D With which Python version? Did you try Python 3.3 (development version)?
msg140561 - (view) Author: Matt Joiner (anacrolix) Date: 2011-07-18 07:10
Feel like a total noob: Where do I get the latest source? I can't find any pre-release tarballs for 3.3, and the suggested py3k checkout doesn't work: $ hg clone http://hg.python.org/cpython#py3k py3k abort: unknown revision 'py3k'!
msg140562 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2011-07-18 07:14
See the developer's guide: http://docs.python.org/devguide/setup.html#getting-the-source-code hg clone http://hg.python.org/cpython directory_name
msg140563 - (view) Author: Matt Joiner (anacrolix) Date: 2011-07-18 07:17
This version is fixed for me: $ ./python Python 3.3.0a0 (default:7520f1bf0a81, Jul 18 2011, 17:12:12) [GCC 4.1.2 20070115 (SUSE Linux)] on linux2
msg140564 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-07-18 07:38
@pitrou: Antoine, do you think that the following commit should be backported from 3.3 to 3.2? New changeset 3c7792ec4547 by Victor Stinner in branch 'default': Issue #12175: BufferedReader.read(-1) now calls raw.readall() if available. http://hg.python.org/cpython/rev/3c7792ec4547 It changes BufferedReader.read() behaviour a *little* bit. Only a little because FileIO.read(-1) calls FileIO.readall() internally for example.
msg140572 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2011-07-18 11:32
> Antoine, do you think that the following commit should be backported > from 3.3 to 3.2? No, I don't think so.
msg140573 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2011-07-18 12:17
> No, I don't think so. The issue is already fixed in 3.3, so you agree to not fix it in Python 3.2?
msg261723 - (view) Author: Martin Panter (martin.panter) * (Python committer) Date: 2016-03-14 04:44
Since this was apparenly only a bug in 3.2, can we close it as being out of date?
History
Date User Action Args
2022-04-11 14:56:46 admin set github: 49755
2016-03-14 21:52:23 berker.peksag set status: open -> closedresolution: out of datestage: resolved
2016-03-14 04:44:15 martin.panter set nosy: + martin.pantermessages: +
2011-07-18 12:17:49 vstinner set messages: +
2011-07-18 11:32:42 pitrou set messages: + versions: - Python 3.0
2011-07-18 07:38:47 vstinner set nosy:ggenellina, pitrou, vstinner, ocean-city, r_mosaic, ned.deily, cassava, famart, anacrolixmessages: +
2011-07-18 07:17:53 anacrolix set messages: + versions: + Python 3.2
2011-07-18 07:14:16 ned.deily set nosy: + ned.deilymessages: +
2011-07-18 07:10:41 anacrolix set messages: +
2011-07-14 10:44:30 vstinner set messages: +
2011-07-14 04:42:12 anacrolix set nosy: + anacrolixmessages: +
2011-07-07 21:37:33 vstinner set messages: +
2011-07-07 21:08:36 vstinner set messages: +
2011-07-07 10:44:56 vstinner set nosy: + vstinner
2010-09-21 15:03:25 ocean-city set messages: -
2010-09-21 15:02:05 ocean-city set messages: +
2009-08-05 02:13:50 ggenellina set nosy: + ggenellinamessages: +
2009-07-31 21:38:54 famart set nosy: + famartmessages: +
2009-03-25 20:49:24 cassava set nosy: + cassavamessages: +
2009-03-25 07:33:01 r_mosaic set messages: +
2009-03-18 16:55:21 ocean-city set messages: +
2009-03-18 16:47:12 ocean-city set nosy: + ocean-citymessages: +
2009-03-18 10:51:57 pitrou set nosy: + pitroumessages: +
2009-03-18 09:20:28 r_mosaic create