Popen warten auf Kind-Prozess, auch wenn die sofortige Kind gekündigt hat

Arbeite ich mit Python 2.7 unter Windows 8/XP.

Ich habe ein Programm, dass läuft ein anderes Programm B mit dem folgenden code:

p = Popen(["B"], stdout=PIPE, stderr=PIPE)
stdout, stderr = p.communicate()
return

B läuft ein batch-Skript C. C ist ein langes script läuft und ich will B zu beenden, obwohl C noch nicht beendet ist. Ich habe es geschafft mit dem folgenden code (in B):

p = Popen(["C"])
return

Wenn ich B, funktioniert es wie erwartet. Wenn ich Ein aber ich erwartete es, um zu beenden, wenn B beendet. Aber wartet, bis C beendet, obwohl B schon exitted. Irgendwelche Ideen auf, was passiert ist und was mögliche Lösungen sein könnten?

Leider die offensichtliche Lösung wechseln zu schauen, wie B nicht eine option.

Hier ist eine funktionale Beispielcode, um dieses Problem zu veranschaulichen:
https://www.dropbox.com/s/cbplwjpmydogvu2/popen.zip?dl=1

Jede Eingabe wird sehr geschätzt.

  • Wenn ich dieses Recht, Sie haben das Programm Bin läuft das Programm B läuft das Programm C. Programm A läuft auch Programm C. Ist das richtig?
  • Nein, Ein Programm nicht ausführen C-Programm direkt. Es wäre toll, wenn Sie warf einen Blick auf angehängte Beispiel. Danke.
  • Also die zweite Popen ist von Programm B?
  • Ja. Einer läuft nur B und hat nichts zu tun mit C direkt.
  • Funktioniert die Versorgung close_fds=True zum zweiten Popen() Hilfe rufen? Ich vermute, dass C erbt die stdout/stderr-Rohre von A und somit Eine wartet, bis C schließt Sie.
  • Ich habe versucht, mit close_fds=True im zweiten Programm (B) und es scheint nicht, einen Unterschied zu machen. Könnten Sie bitte den beigefügten Beispiel-und sehen, ob etwas getan werden kann?

InformationsquelleAutor khattam | 2012-11-06
Schreibe einen Kommentar