Problem in using subprocess module and communicate()

Tim Golden mail at timgolden.me.uk
Mon May 23 11:13:38 EDT 2011


[cc-ing back to the list; please keep the conversation over there...]

On 23/05/2011 13:11, vijay swaminathan wrote:
> What I want to achieve is, I want to run a batch file on a command prompt.
>
> The reason for using thread is not for running multiple scripts
> simultaneously. It is just to monitor my script running in command
> prompt. only on closing the command prompt, I like to perform some more
> actions. so I look to monitor my thread. Hope it is clear until now.

Ok. That's perfectly clear.

>
> the below mentioned code does not invoke the command prompt at all. Does
> the subprocess.call take care of invoking the command prompt?

Adding shell=True invokes %COMSPEC% (usually cmd.exe) under the covers.
How do you know it's not invoking the command prompt? Does your
batch file generate output? And is that output generated? Without
the CREATE_NEW_CONSOLE flag, you won't see an extra box pop up, but
unless you specifically want one, then don't bother.

OK, baby steps. Here's a batch file:

<tjg.bat>
@echo Hello

</tjg.bat>

and here's a Python script which runs it:

<tjg.py>
import subprocess

subprocess.call ("tjg.bat", shell=True)

</tjg.py>

I opened a console (cmd.exe), ran tjg.py and, as expected, "Hello"
appears in the same console. Note that, if I hadn't made the .bat
file generate some output I wouldn't have seen anything but it
would still have worked.

I now make the .bat file do something more long-winded, such as
fire up a Python session which waits for five seconds and then
completes:

<tjg.bat>
@echo off
echo Starting
python -c "import time; time.sleep (5)"
echo Finished

</tjg.bat>

When I run tjg.py again, I see "Starting" and then a pause of
5 seconds, and then "Finished".

Now let's make the Python program monitor to see when that batch has 
finished by watching the isAlive status and then sleeping for a second:

<tjg.py>
import subprocess
import threading
import time

def run_tjg ():
   subprocess.call ("tjg.bat", shell=True)

t = threading.Thread (target=run_tjg)
t.start ()

while t.isAlive ():
   print "is alive"
   time.sleep (1)

print "Thread is complete"
</tjg.py>


When I run this, I get a mixture of output, depending on what
gets to the console first, but essentially I see the batch file
starting, I get a series of about 5 "is alive" messages, then
the batch file "Finished" message and the Python "Thread is
complete" message.

Does that work for you?

TJG



More information about the Python-list mailing list