[ python-Bugs-1012692 ] Can't pipe input to a python program

SourceForge.net noreply at sourceforge.net
Sat Aug 21 20:49:31 CEST 2004

Bugs item #1012692, was opened at 2004-08-20 01:31
Message generated for change (Comment added) made by tim_one
You can respond by visiting: 

Category: Windows
>Group: 3rd Party
>Status: Closed
>Resolution: Wont Fix
Priority: 5
Submitted By: Ronald L. Rivest (rivest)
>Assigned to: Tim Peters (tim_one)
Summary: Can't pipe input to a python program

Initial Comment:
Details in attached file.  Basically, I want to be 
able (in Windows) to pipe input as in:
    type spam.txt | eggs.py
so that eggs can read the file spam.txt.  But I am
getting an  Errno 9: Bad file descriptor error message.


        Ron Rivest
        rivest at mit.edu 
 [Please reply to rivest at mit.edu as well...]


>Comment By: Tim Peters (tim_one)
Date: 2004-08-21 14:49

Logged In: YES 

I see the same on my Win XP Pro SP1 box, but I expected 
to.  The problem is in cmd.exe (the native XP shell), and both 
MS shells (command.com and cmd.exe) have had multiple 
bugs with I/O redirection forever.  This somewhat confused 
MS KB article describes the current state for cmd.exe 
systems, in part incorrectly:

"STDIN/STDOUT Redirection May Not Work If Started from a 
File Association"


It works fine if you change the "eggs.py" part of your 
command line to "python eggs.py", where "python" is some 
string that resolves to your Python executable, or even to 
a .bat script that runs python.exe explicitly.  For example, I 
have a py.bat on my PATH, containing just

\python23\python.exe %1 %2 %3 %4 %5 %6 %7 %8 %9

and then

    type spam.txt | py eggs.py

works fine.  The point is that it doesn't work if Python gets 
started via .py *association*; any other way of getting 
Python started works fine.

Since this has nothing to do with Python (same thing if you 
use, e.g., Perl), I'm closing this as 3rd Party, Won't Fix.

BTW, the KB article above claims the problem was fixed in XP 
SP1.  It does indeed appear to have been fixed for stdout 
redirection, but not for stdin.

You could also use Cygwin on Windows, whose default bash 
shell has sane behavior in this respect.

Martin, it's sure curious that it works for you!  My ver output 
is also "Microsoft Windows XP [Version 5.1.2600]".  Is that 
enough to distinguish Home from Pro versions?  I have Pro 
here.  What do you have?  Is yours a German flavor of XP?

I'll note that I get one more line of output than Ron reported 
(the first output line, about "a nonexistent pipe"):

C:\Code\python\PCbuild>type tcap.txt | eggs.py
The process tried to write to a nonexistent pipe.
Traceback (most recent call last):
  File "C:\Code\python\PCbuild\eggs.py", line 4, in ?
    text = sys.stdin.read()
IOError: [Errno 9] Bad file descriptor


Comment By: Ronald L. Rivest (rivest)
Date: 2004-08-21 13:43

Logged In: YES 

If I print out sys.stdin.fileno(), I get  -1 .
Ver.exe outputs: Microsoft Windows XP [Version 5.1.2600]
This is indeed the standard command interpreter; I set the
prompt envinronment variable to output just ">".


        Ron Rivest


Comment By: Martin v. Löwis (loewis)
Date: 2004-08-21 11:09

Logged In: YES 

What shell is this in? I cannot reproduce this in a cmd.exe
window. However, that you report the version as "Windows 5.1
(Build 2600)" and not "Microsoft Windows XP [Version
5.1.2600]" (as ver.exe does), and that you use just ">" as
the prompt suggests you might be using a different command

Can you please add

print sys.stdin.fileno()

into the script? On my system, it gives "0".


You can respond by visiting: 

More information about the Python-bugs-list mailing list