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
War es hilfreich?

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()) ?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top