470,648 Members | 1,618 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,648 developers. It's quick & easy.

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

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.
Jun 27 '08 #1
4 5449
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
Jun 27 '08 #2
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

Jun 27 '08 #3
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...
Jun 27 '08 #4
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

Jun 27 '08 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by Marc Carter | last post: by
14 posts views Thread by Ernesto | last post: by
2 posts views Thread by Ernesto | last post: by
12 posts views Thread by Perecli Manole | last post: by
9 posts views Thread by Phoe6 | last post: by
4 posts views Thread by 7stud | last post: by
12 posts views Thread by bhunter | last post: by
6 posts views Thread by John Mechaniks | last post: by
25 posts views Thread by Jeremy Banks | last post: by
1 post views Thread by Korara | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.