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

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • grayaii

    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.Pope n(command, shell=True, stdout=subproce ss.PIPE, stdin=None, stderr=subproce ss.PIPE, env=os.environ, universal_newli nes=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(com mand) ## 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.Pope n and they all hang on this exe. Even if try to do
    the usual (pseudo code):
    while(returncod e 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.Pope n thinks the
    process hasn't finished.

    Any ideas would be greatly appreciated. I'm all ears.
  • Christian Heimes

    #2
    Re: subprocess wait() waits forever, but os.system returns

    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.Pope n(command, shell=True, stdout=subproce ss.PIPE, stdin=None, stderr=subproce ss.PIPE, env=os.environ, universal_newli nes=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

    Comment

    • Christian Heimes

      #3
      Re: subprocess wait() waits forever, but os.system returns

      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.Pope n(command, shell=True, stdout=subproce ss.PIPE, stdin=None, stderr=subproce ss.PIPE, env=os.environ, universal_newli nes=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

      Comment

      • grayaii

        #4
        Re: subprocess wait() waits forever, but os.system returns

        Awesome! That worked!
        And your comment just led me down another exploration path on why the
        following doesn't work:
        ---------------------
        while(returncod e is None):
        returncode = run.poll()
        time.sleep(1)

        out = run.stdout.read lines()
        err = run.stderr.read lines()
        ---------------------
        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...

        Comment

        • Christian Heimes

          #5
          Re: subprocess wait() waits forever, but os.system returns

          grayaii schrieb:
          Awesome! That worked!
          And your comment just led me down another exploration path on why the
          following doesn't work:
          ---------------------
          while(returncod e is None):
          returncode = run.poll()
          time.sleep(1)
          >
          out = run.stdout.read lines()
          err = run.stderr.read lines()
          ---------------------
          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.readline s() call.

          Christian

          Comment

          Working...