Thorsten Pferdekämper wrote:
"Jane Austine" <ja***********@hotmail.com> wrote in message
news:ba**************************@posting.google.c om... I need to control a command line program via python.
I first tried popen2 and 3 but I couldn't find a way to talk to the
subprocess interactively; that is, read some and then write some, and
read some more again... (suppose controlling an interactive shell
program) When I try this with popen family, it just hangs. I have to
close one pipe before reading from the other.
I know that there is a wonderful thing called Expect, but it's not
available on my machine(win32).
Can anyone help me out?
Hi,
in "Python in a nutshell", I have found a remark about that. It seems that
this depends on some buffering mechanisms the programs use. The program
you are running with popen just waits until the input stream is closed. As
long as you can not control the behaviour of this program, you hardly can
do anything, espacially on win32.
Right: there is, indeed, very little you can do in the general case. If a
"commandline program" buffers its stdio when it's talking to pipes rather
than a terminal, then the only way to drive its input AND read its output
"a little at a time" is to trick it into believing that it's talking to a
terminal -- not easy on Windows. Unfortunately, typical C runtime libraries
implementing stdio _DO_ behave exactly like this -- buffering except when
talking to a terminal...
Perhaps you can try spawn().
That would not help at all -- it cannot defeat buffering.
One thing that COULD defeat buffering, IF your particular win32 machine
supports a telnet-server (but I think you may need some extra-cost MS
add-on for that), would be for your Python program to "telnet to localhost"
and run the commandline program that way.
Alternatively, you MIGHT be able to find a version of 'expect' that
works with your machine. Google may help; e.g., try
http://bmrc.berkeley.edu/people/chaffee/expectnt.html
Expect is a Tcl/Tk add-on, not a Python one, but if you can use it, it
can still open avenues towards possible solutions.
Alex