Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > subprocess wait() waits forever, but os.system returns

Reply
Thread Tools

subprocess wait() waits forever, but os.system returns

 
 
grayaii
Guest
Posts: n/a
 
      05-07-2008
There are so many threads on this subject, but I ran across a
situation on Windows that I can't figure out.

I'm trying to run this little command-line exe and when I launch like
this, it hangs:

>>> import subprocess
>>> command = r'c:\mydir\foo.exe'
>>> run = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=None, stderr=subprocess.PIPE, env=os.environ, universal_newlines=True)
>>> returncode = run.wait() ## HANGS HERE ##


I can run this exe manually via the command prompt and it returns
after a few seconds, but more importantly when I run it as follows it
works fine:

>>> import os
>>> command = r'c:\mydir\foo.exe'
>>> os.system(command) ## WORKS FINE! ##


Unfortunately I don't know too much about the exe (well, I do know
that it spits out some stdout that I collect, but I don't know the
exe's source code.)

I can't figure out why the subprocess module is having a hard time
with this particular exe. I've tried so many different permutations
of subprocess.Popen and they all hang on this exe. Even if try to do
the usual (pseudo code):
while(returncode is None):
returncode = run.poll()
time.sleep(1)
blah blah blah

returncode is always None... In other words, it's hung. I can't
figure out why os.system works fine, but subprocess.Popen thinks the
process hasn't finished.

Any ideas would be greatly appreciated. I'm all ears.
 
Reply With Quote
 
 
 
 
Christian Heimes
Guest
Posts: n/a
 
      05-07-2008
grayaii schrieb:
> There are so many threads on this subject, but I ran across a
> situation on Windows that I can't figure out.
>
> I'm trying to run this little command-line exe and when I launch like
> this, it hangs:
>
>>>> import subprocess
>>>> command = r'c:\mydir\foo.exe'
>>>> run = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=None, stderr=subprocess.PIPE, env=os.environ, universal_newlines=True)
>>>> returncode = run.wait() ## HANGS HERE ##


The code blocks because you aren't reading from stdout and stderr. Use
the communicate() method instead of wait().

Christian
 
Reply With Quote
 
 
 
 
Christian Heimes
Guest
Posts: n/a
 
      05-07-2008
grayaii schrieb:
> There are so many threads on this subject, but I ran across a
> situation on Windows that I can't figure out.
>
> I'm trying to run this little command-line exe and when I launch like
> this, it hangs:
>
>>>> import subprocess
>>>> command = r'c:\mydir\foo.exe'
>>>> run = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=None, stderr=subprocess.PIPE, env=os.environ, universal_newlines=True)
>>>> returncode = run.wait() ## HANGS HERE ##


The code blocks because you aren't reading from stdout and stderr. Use
the communicate() method instead of wait().

Christian

 
Reply With Quote
 
grayaii
Guest
Posts: n/a
 
      05-07-2008
Awesome! That worked!
And your comment just led me down another exploration path on why the
following doesn't work:
---------------------
while(returncode is None):
returncode = run.poll()
time.sleep(1)

out = run.stdout.readlines()
err = run.stderr.readlines()
---------------------
Nowhere in the loop am I reading stdout or err.
I'm only reading it after the loop has finished, and when running the
exe, returncode is *always* None.
Now I have to figure out a way to read it within the loop without
blocking the read... on Windows...

Thinking out loud: Perhaps it would be better to put the subprocess
commands in a separate thread so if my process hangs, I can kill it
after a given time. Various threads in this forum suggested that
method, so perhaps I should do it that way...
 
Reply With Quote
 
Christian Heimes
Guest
Posts: n/a
 
      05-07-2008
grayaii schrieb:
> Awesome! That worked!
> And your comment just led me down another exploration path on why the
> following doesn't work:
> ---------------------
> while(returncode is None):
> returncode = run.poll()
> time.sleep(1)
>
> out = run.stdout.readlines()
> err = run.stderr.readlines()
> ---------------------
> Nowhere in the loop am I reading stdout or err.
> I'm only reading it after the loop has finished, and when running the
> exe, returncode is *always* None.
> Now I have to figure out a way to read it within the loop without
> blocking the read... on Windows...


the subprocess has already a canonical way:

out, err = run.communicate()

Your code may still block if the stderr buffer is full during the
stdout.readlines() call.

Christian

 
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
BaseHTTPRequestHandler delays server response after "Popen"ing aprogram that waits for user input? (getline, fgets, etc.) gburdell1@gmail.com Python 0 04-16-2009 08:52 PM
Help in Threading when program waits for an input Mithil Java 2 05-29-2007 07:40 PM
DatagramSocket.receive waits forever (despite 3 second SoTimeout)! Imran Java 1 10-15-2005 12:19 AM
Java waitfor waits for completion of forked child pwu@qantas.com.au Java 2 08-25-2005 08:58 AM
Timer while user waits GrantMagic ASP .Net 1 09-09-2004 12:05 PM



Advertisments