Python-Unterprozesskommunikation beendet meinen Prozess
-
21-12-2019 - |
Frage
Warum beendet Kommunikation meinen Prozess?Ich möchte einen interaktiven Prozess, aber communicate tut etwas, damit ich raw_input nicht mehr in meinen Prozess aufnehmen kann.
from sys import stdin
from threading import Thread
from time import sleep
if __name__ == '__main__':
print("Still Running\n")
x = raw_input()
i = 0
while ('n' not in x ) :
print("Still Running " + str(i) + " \r\n")
x = raw_input()
i += 1
print("quit")
print(aSubProc.theProcess.communicate('y'))
print(aSubProc.theProcess.communicate('y'))
ausnahme!
self.stdin.write(input)
ValueError: I/O operation on closed file
Lösung
communicate
und wait
methoden von Popen
objekte, schließen Sie die PIPE
nachdem der Prozess zurückgekehrt ist.Wenn Sie mit dem Prozess in Verbindung bleiben möchten, versuchen Sie so etwas:
import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()
Andere Tipps
Warum beendet Kommunikation meinen Prozess?
Aus den Dokumenten für Popen.communicate(input=None, timeout=None)
:
Interaktion mit dem Prozess:Senden Sie Daten an stdin.Daten von stdout lesen und
stderr, bis das Dateiende erreicht ist. Warten Sie, bis der Prozess beendet ist. betonen Sie meine
Sie können anrufen .communicate()
nur einmal.Dies bedeutet, dass Sie alle Eingaben auf einmal bereitstellen sollten:
#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
p = Popen([sys.executable, 'child.py'], stdin=PIPE, stdout=PIPE)
print p.communicate(os.linesep.join('yyn'))[0]
Ausgabe
Still Running
Still Running 0
Still Running 1
quit
Beachten Sie die doppelten Zeilenumbrüche:einer von '\r\n'
und noch einer von print
anweisung selbst in Ihrem Skript für den untergeordneten Prozess.
Die Ausgabe zeigt, dass der Kindprozess drei Eingabezeilen erfolgreich empfangen hat ('y'
, 'y'
, und 'n'
).
Hier ist ein ähnlicher Code mit subprocess.check_output()
von input
parameter aus Python3.4:
#!/usr/bin/env python3.4
import os
import sys
from subprocess import check_output
output = check_output(['python2', 'child.py'], universal_newlines=True,
input='\n'.join('yyn'))
print(output, end='')
Es erzeugt die gleiche Ausgabe.
Wenn Sie abhängig von den Antworten der untergeordneten Prozesse eine andere Eingabe bereitstellen möchten, verwenden Sie pexpect
modul oder seine Analoga, um die in genannten Probleme zu vermeiden Warum nicht einfach eine pipe (popen()) ?