[issue1175] .readline() has bug WRT nonblocking files
Changes by Yuri Bochkarev baltazar...@gmail.com: -- nosy: +Yuri.Bochkarev ___ Python tracker rep...@bugs.python.org http://bugs.python.org/issue1175 ___ ___ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue1175] .readline() has bug WRT nonblocking files
Guido van Rossum added the comment: readline() goes through C stdio which makes it impossible to get non-blocking I/O right. You should be using raw os.read() calls (until python 3000 which will remove Python's reliance on C stdio). -- nosy: +gvanrossum resolution: - wont fix status: open - closed __ Tracker [EMAIL PROTECTED] http://bugs.python.org/issue1175 __ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue1175] .readline() has bug WRT nonblocking files
New submission from Alex Burr: If you have made a file nonblocking using fcntl.fcntl, .readline() will discard the start of a line if you get EGAIN. It should attach the partial line to the exception somehow - or at least warn the user. I observe this on 2.3.5, but the same code exists in TRUNK -- components: Interpreter Core messages: 55993 nosy: ajb severity: normal status: open title: .readline() has bug WRT nonblocking files type: behavior versions: Python 2.3 __ Tracker [EMAIL PROTECTED] http://bugs.python.org/issue1175 __ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue1175] .readline() has bug WRT nonblocking files
Sean Reifschneider added the comment: Doesn't the exception count as warning the user? We probably don't want to change readline to return a partial line in this case. An exception could be added for EGAIN that includes the partial line. Another option would be to just document the behavior for readline or fcntl. What is the right behavior for a non-blocking readline? Obviously, it can't return a None and buffer the line. Another option would be to define readline as a blocking operation and enable buffering before starting the readline, and possibly revert it when done. Opinions? -- components: +Library (Lib) -Interpreter Core nosy: +jafo priority: - low type: behavior - rfe versions: +Python 2.4, Python 2.5, Python 2.6 __ Tracker [EMAIL PROTECTED] http://bugs.python.org/issue1175 __ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue1175] .readline() has bug WRT nonblocking files
Alex Burr added the comment: The exception would count as a warning if it wasn't EGAIN. One expects to catch EGAIN and try again. The current situation is unfortunate because it *nearly* works. My scenario is: I'm driving GDB/MI via popen2.Popen3 ( gdbCommand, False,1). It works for most GDB commands, but sometimes GDB returns a huge line and I get EGAIN in the middle. (For my purposes, I've worked round it, by avoiding the command which generates a long line) __ Tracker [EMAIL PROTECTED] http://bugs.python.org/issue1175 __ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue1175] .readline() has bug WRT nonblocking files
Sean Reifschneider added the comment: Why are you putting the file in non-blocking mode? Why not just reading in blocking mode? If you want to do other work when a line is not available, you could use select to check to see if there's data ready via a small or 0 timeout. __ Tracker [EMAIL PROTECTED] http://bugs.python.org/issue1175 __ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com
[issue1175] .readline() has bug WRT nonblocking files
Sean Reifschneider added the comment: Arguably, you should be using select and read (instead of readline) for this operation. That's what I've done in the past when doing something similar. Specifically, I believe I have looped reading into a buffer with read, and using select with a timeout (even a fraction of a second can work) until the timeout triggers. This way I don't block, but I also don't run into problems with the system call returning an error. I avoid using readline in this case because I don't expect it to work well on the stdout of an interactive command. You may also want to look at the pty module. I guess I'd say this should probably go to the python mailing list for further discussion. Can you post a message there about it? __ Tracker [EMAIL PROTECTED] http://bugs.python.org/issue1175 __ ___ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com