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