David,

 

The subprocess module doesn't work for interactive programs (I think) (see appended pexpect faq).

 

So instead, I was trying to get something like the following working:

import simnow # import complex simnow C++ application

simnow.start() # spawn simnow's main method

output1 = simnow.sendCommand("load platform x") # blocking call to a single simnow C++ functions

# This is our real current goal, but if I get this working, we might consider exposing other simnow functionality to the simnow python module.

 

disutils is listed in the extend/embed python doc (http://www.python.org/doc/ext/ext.html).  This doc seems to be saying that disutils is a cross-plaform way to build a python module ("extend python").

 

Chapter 3 - disultils cross-platform build.  Chapter 4 - do it yourself windows build.  Chapter 5 - do it yourself unix build.  Chapter 4 says, "Module authors are encouraged to use the distutils approach for building extension modules, instead of the one described in this section."

 

--Thanks

 

 

 

subprocess - "appended comments"

# This doesn't work

self.simnow = Popen(executable=(os.getcwd() + '/simnow'), args=simnowCmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)

self.simnow.stdin.write("open stuff")

print self.simnow.stdout.read()

 

Why doesn't it work?  The following is from the pexect FAQ

 

Q: Why not just use a pipe (popen())?

A: A pipe works fine for getting the output to non-interactive programs. If you just want to get the output from ls, uname, or ping then this works. Pipes do not work very well for interactive programs and pipes will almost certainly fail for most applications that ask for passwords such as telnet, ftp, or ssh.

There are two reasons for this.

First an application may bypass stdout and print directly to its controlling TTY. Something like SSH will do this when it asks you for a password. This is why you cannot redirect the password prompt because it does not go through stdout or stderr.

The second reason is because most applications are built using the C Standard IO Library (anything that uses #include <stdio.h>). One of the features of the stdio library is that it buffers all input and output. Normally output is line buffered when a program is printing to a TTY (your terminal screen). Everytime the program prints a line-feed the currently buffered data will get printed to your screen. The problem comes when you connect a pipe. The stdio library is smart and can tell that it is printing to a pipe instead of a TTY. In that case it switches from line buffer mode to block buffered. In this mode the currently buffered data is flushed when the buffer is full. This causes most interactive programs to deadlock. Block buffering is more efficient when writing to disks and pipes. Take the situation where a program prints a message "Enter your user name:\n" and then waits for you type type something. In block buffered mode, the stdio library will not put the message into the pipe even though a linefeed is printed. The result is that you never receive the message, yet the child application will sit and wait for you to type a response. Don't confuse the stdio lib's buffer with the pipe's buffer. The pipe buffer is another area that can cause problems. You could flush the input side of a pipe, whereas you have no control over the stdio library buffer.

http://pexpect.sourceforge.net/#faq

 

What's wrong with pexpect?  It doesn't work on Windows.  Python COM is an alternative, but we are trying to find a clean unified cross-platform solution.

 

 

Peter Mowry ("Pem")

SimNow Team, Software Engineer

AMD Organization

 

 

-----Original Message-----
From: David Arnold [mailto:david@mantara.com]
Sent: Saturday, May 12, 2007 10:00 PM
To: Mowry, Peter
Cc: distutils-sig@python.org
Subject: Re: [Distutils] Python module to: Talk to stdout/stdin for 64-bit Windows/Linux C++ application?

 

-->"Peter" == Mowry, Peter <peter.mowry@amd.com> writes:

 

  Peter> My team's application does regressions by controlling our

  Peter> 64-bit Windows/Linux C++ application (SimNow,

  Peter> www.amd.com/simnow) via stdout/stdin with ("pexpect" for unix)

  Peter> and (python COM objects) for Windows (b/c popen doesn't work). 

  Peter> However, I am trying to replace this with a unified

  Peter> windows/linux solution.

 

have you looked at the subprocess module, part of the standard library

in Python 2.4 and later?

 

  Peter> Does extending python with Disutils sound like the simple and

  Peter> clean way for my goal?  Is there a simple cookbook solution for

  Peter> my goal?

 

i don't think distutils is what you're after.  distutils is about

producing installers for Python applications.

 

 

 

 

d