2016-09-13 3 views
4
  child = subprocess.Popen(command, 
         shell=True, 
         env=environment, 
         close_fds=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT, 
         bufsize=1, 
            ) 

      subout = "" 
      with child.stdout: 
       for line in iter(child.stdout.readline, b''): 
        subout += line 
      logging.info(subout) 
      rc = child.wait() 

einige Male (mit Unterbrechungen) das hängt für immer. nicht sicher, ob es hängt an iter(child.stdout.readline) oder child.wait()Python Subprozess.Popen hängend

i ps -ef für den Prozess es POPENS und dieser Prozess nicht mehr existiert

meine Vermutung ist, dass es mit bufsize hat zu tun, so dass child.stdout.readline los ist für immer, aber ich habe keine Ahnung, wie es zu testen und wie dies geschieht intermittierend

I Alarm implementieren könnte, aber im nicht sicher, ob das angemessen ist, wie ich wirklich, ob der popen'd Prozess

nur langsam oder hängen sagen kippe lass uns ein Nehmen wir an, dass entweder child.stdout.readline oder wait() für immer hängen bleibt. Welche Aktionen könnte ich außer Alarm durchführen?

Antwort

5

Sie schlagen wahrscheinlich aus der Sackgasse, die explained in the documentation ist:

Popen.wait():

Warten Kind-Prozess zu beenden. Setzen und zurückgeben returncode Attribut.

Achtung: Dies wird Deadlock beim stdout=PIPE und/oder stderr=PIPE und der untergeordnete Prozess erzeugt genug Ausgang an einem Rohr derart, daß sie für die Blöcke OS Rohrpuffer warten, mehr Daten zu akzeptieren. Verwenden Sie communicate(), um dies zu vermeiden.

Die Lösung ist zu verwenden .

+0

danke krank zu kommunizieren! – ealeon