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

G

grayaii

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:

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:

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.
 
C

Christian Heimes

grayaii said:
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:

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

Christian
 
C

Christian Heimes

grayaii said:
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:

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

Christian
 
G

grayaii

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...
 
C

Christian Heimes

grayaii said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top