Domanda

Perché la comunicazione uccide il mio processo?Voglio un processo interattivo ma comunicare fa qualcosa per cui non posso più accettare raw_input nel mio processo.

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'))

eccezione!

self.stdin.write(input)
ValueError: I/O operation on closed file
È stato utile?

Soluzione

communicate e wait Metodi di Popen Objects, chiudere PIPE dopo il ritorno del processo.Se vuoi rimanere in comunicazione con il processo prova qualcosa del genere:

import subprocess
proc = subprocess.Popen("some_process", stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write("input")
proc.stdout.readline()
.

Altri suggerimenti

Perché la comunicazione uccide il mio processo?

Dai documenti per Popen.communicate(input=None, timeout=None):

Interagisci con il processo:Invia i dati a stdin.Leggi i dati da stdout e
stderr, fino al raggiungimento della fine del file. Attendi il completamento del processo. sottolineo il mio

Puoi chiamare .communicate() solo una volta.Significa che dovresti fornire tutti gli input in una volta:

#!/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]

Produzione

Still Running

Still Running 0 

Still Running 1 

quit

Notare i ritorni a capo raddoppiati:uno da '\r\n' e un altro da print dichiarazione stessa nello script per il processo figlio.

L'output mostra che il processo figlio ha ricevuto tre righe di input con successo ('y', 'y', E 'n').

Ecco un codice simile utilizzando subprocess.check_output()'S input parametro da 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='')

Produce lo stesso output.


Se desideri fornire un input diverso a seconda delle risposte dei processi figlio, utilizza pexpect modulo o suoi analoghi per evitare i problemi menzionati in Perché non usare semplicemente una pipe (popen())?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top