[Python-bugs-list] [ python-Bugs-633480 ] IOError w/ large string to CMD shell

noreply@sourceforge.net noreply@sourceforge.net
Thu, 07 Nov 2002 09:10:37 -0800


Bugs item #633480, was opened at 2002-11-04 16:06
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=633480&group_id=5470

Category: Windows
Group: 3rd Party
>Status: Closed
>Resolution: Wont Fix
Priority: 4
Submitted By: Michael McCandless (mikemccand)
Assigned to: Tim Peters (tim_one)
Summary: IOError w/ large string to CMD shell

Initial Comment:

If I try to run this program with "python2.2.1 -u":

  # 61409 works!!
  print ' ' * 61410

(which tries to print a string of 61,410 space characters), 
I get this Traceback on Windows 2000 SP2:

  Traceback (most recent call last):
    File "write.py", line 4, in ?
      print ' ' * 61410
  IOError: [Errno 12] Not enough space

Without "-u", this runs fine, and if I change "print" 
to "import sys; sys.stdout.write" instead, it still fails.

I think this is happening in Objects/fileobject.c -- the 
calls to fwrite apparently don't write all bytes in win32 
when the number of bytes is large -- seems like it may 
be necessary to parcel the data up into smaller pieces 
or something?

NOTE: it's possible that the exact length of the string 
that fails may be larger on other OS's...

----------------------------------------------------------------------

>Comment By: Tim Peters (tim_one)
Date: 2002-11-07 12:10

Message:
Logged In: YES 
user_id=31435

I'm attaching a short C program showing that the same thing 
happens in straight C.  But there's a surprise:  turns out it 
has nothing to do with buffered versus unbuffered.  It's 
changing stdout to binary mode that does the damage.  This 
is also specific to writing to my Win2K console window 
("DOS box"); if cmdline redirection is used to redirect stdout 
to a file instead, it doesn't fail.

So, as threatened, closing this as WontFix -- if there's "a 
bug" here at all, it's in Microsoft's code.  They may well claim 
it's a design limitation, if it were possible to talk with a human 
being there <wink..

----------------------------------------------------------------------

Comment By: Michael McCandless (mikemccand)
Date: 2002-11-06 06:47

Message:
Logged In: YES 
user_id=323786


Tim,

Okay -- that sounds like the right approach here -- thanks 
again.  Don't think I'll be upgrading to Win98 too soon :)  And 
I don't have high hopes on getting a fix out of MSFT :)

Mike

----------------------------------------------------------------------

Comment By: Tim Peters (tim_one)
Date: 2002-11-05 23:55

Message:
Logged In: YES 
user_id=31435

The thing is, if you want to do this, you're going to *have* to 
worm around it.  I've got no magic to offer -- it's a vanilla C 
library call, and there's no sign that Python has anything to 
do with the failure.  Try doing a staight fwrite() to stdout, 
unbuffered, in C, and I expect you'll see the same thing (or 
if not, then *maybe* Python had something to do with it).

If it does fail in straight C, then filing a bug report with 
Microsoft is appropriate.  Or you could upgrade to Win98 
<wink>.

Assigning to me and marking 3rdParty; I expect to close it 
as WontFix unless evidence appears that not a Windows 
bug.

BTW, you may have better luck installing the Python Win32 
extensions and using the Win32 file API directly.  
Sometimes that works better than MS's std-C I/O 
implementation.

----------------------------------------------------------------------

Comment By: Michael McCandless (mikemccand)
Date: 2002-11-05 08:29

Message:
Logged In: YES 
user_id=323786

Thanks for looking into this Tim...

True, we can workaround it -- either don't run UNBUFFERED, 
or break up the strings before printing (override sys.stdout w/ 
our own file object that tries to break things up before 
printing), or don't run under "CMD" or other platform-specific 
shells that have this issue.

But it's rather unexpected and to a "Python newbie" would 
be "surprising"; though I suppose most would not run with "-
u".

Also, from the IOError that's raised I don't know how many 
bytes were actually successfully written (apparently 0 in this 
case).

NOTE: I'm able to reproduce on Windows XP Professional 
(no SP), running "cmd.exe", Python 2.2.2.  I've also tried 
changing the "screen buffer" sizes on the CMD and it does 
not seem to change things.

----------------------------------------------------------------------

Comment By: Tim Peters (tim_one)
Date: 2002-11-04 16:34

Message:
Logged In: YES 
user_id=31435

Couldn't reproduce under Win98SE and 2.2.2 even 
boosting the size to a million.  It *may* have to do with 
console-size settings under cmd.exe.

Reduced the priority.  "So don't do that" comes to mind 
<wink>.  Seriously, if the platform C fwrite chokes, it's not 
Python's job to fix it -- it's Microsoft's.  The interpreter isn't 
dying here, it's raising a well-behaved exception, just 
passing on the error the platform fwrite() raised.  To me it's 
the same as the system malloc complaining that you don't 
have enough memory to satisfy a request:  you've 
exceeded a platform limitation.  If this is important to you, 
you can presumably fix it yourself by chunking up your 
writes in a loop.

----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=633480&group_id=5470