os.popen on windows: loosing stdout of child process

half.italian at gmail.com half.italian at gmail.com
Sat May 12 00:33:54 EDT 2007


On May 11, 8:46 pm, Greg Ercolano <e... at 3dsite.com> wrote:
>         When I use os.popen(cmd,'w'), I find that under windows, the stdout
>         of the child process disappears, instead of appearing in the DOS window
>         the script is invoked from. eg:
>
> C:\> type foo.py
> import os
> import sys
> file = os.popen("nslookup", 'w')
> file.write("google.com\n")
> file.close()
>
> C:\> python foo.py
>                         <-- nothing is printed
> C:\>
>
>         This just seems wrong. The following DOS equivalent works fine:
>
> C:\> echo google.com | nslookup
> Default Server:  dns.erco.x
> Address:  192.168.1.14
> [..expected output..]
>
>         When I run the same python program on a unix box, the output
>         from 'nslookup' appears in the terminal, as I'd expect.
>
>         Shouldn't popen() be consistent in its handling of the child's
>         stdout and stderr across platforms?
>
>         Maybe I'm missing something, being somewhat new to python, but
>         an old hand at unix and win32 and functions like popen(). Didn't
>         see anything in the docs for popen(), and I googled around quite
>         a bit on the web and groups for eg. 'python windows popen stdout lost'
>         and found nothing useful.
>
>         FWIW, I'm using the windows version of python 2.5 from activestate.

Glad to see you're finally coming into the light Greg!  I've used Rush
in a few different studios over the past couple of years.  We even had
sushi once.  :)

I'm no expert like you, but I think I can point you in the right
direction.  You need os.popen2 which returns a tuple of file-like
objects. The first pointing to stdin, and the second pointing to
stdout.  Write to stdin, and read from stdout.

import os
import sys
stdin, stdout = os.popen2("nslookup")
stdin.write("google.com\n")
stdin.close()

print stdout.read()
stdout.close()

I don't use windows much, but I believe the os.popen functionality is
being replaced by subprocess.Popen:

from subprocess import *
import sys

p = Popen("nslookup", shell=True, bufsize=1024, stdin=PIPE,
stdout=PIPE, close_fds=True)
p.stdin.write("google.com\n")
p.stdin.close()

print p.stdout.read()
p.stdout.close()

I found these:
http://pydoc.org/2.4.1/subprocess.html
http://docs.python.org/lib/module-subprocess.html

~Sean DiZazzo
Curious George




More information about the Python-list mailing list