Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > os.popen on windows: loosing stdout of child process

Reply
Thread Tools

os.popen on windows: loosing stdout of child process

 
 
Greg Ercolano
Guest
Posts: n/a
 
      05-12-2007
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.
 
Reply With Quote
 
 
 
 
Gabriel Genellina
Guest
Posts: n/a
 
      05-12-2007
En Sat, 12 May 2007 00:46:16 -0300, Greg Ercolano <(E-Mail Removed)>
escribió:

> 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: [...]
> 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.


Using the subprocess module is the recommended approach (as you can see on
the os.popen documentation) and does what you want:

C:\TEMP>type foo2.py
import subprocess
p = subprocess.Popen("nslookup", stdin=subprocess.PIPE)
p.stdin.write("google.com\n")
p.stdin.close()

C:\TEMP>python foo2.py

C:\TEMP>Servidor predeterminado: coyote.softlabbsas.com.ar
Address: 192.168.0.116

> Servidor: coyote.softlabbsas.com.ar

Address: 192.168.0.116

Respuesta no autoritativa:
Nombre: google.com
Addresses: 64.233.187.99, 64.233.167.99, 72.14.207.99

>

C:\TEMP>

For more info about subprocess usage, see
http://docs.python.org/lib/module-subprocess.html

--
Gabriel Genellina

 
Reply With Quote
 
 
 
 
half.italian@gmail.com
Guest
Posts: n/a
 
      05-12-2007
On May 11, 8:46 pm, Greg Ercolano <(E-Mail Removed)> 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
pexpect on windows - child process of another child process - quickquestion Z W Python 0 03-09-2013 10:00 PM
Starting a child process and getting its stdout? cypher543 Python 8 12-30-2006 05:49 PM
stdin & stdout of child process Java 2 08-29-2005 11:15 PM
Help with controlling stdin/stdout for a child process Mike Finister C++ 1 07-24-2004 06:02 PM
Run child process with stdout and result on Win32? Dave Sellars Python 1 06-07-2004 03:01 PM



Advertisments