Sottoprocesso Python Popen readline prima di chiudere lo stdin
import subprocess as sp
p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE)
p.stdin.write(b"foobaz!\n")
p.stdin.close()
print(p.stdout.readline())
Questo codice funziona come previsto (cat fa eco allo stdin e possiamo leggere lo stdout)
Se commentiamo il p.stdin.close(), i .readline()blocchi a tempo indeterminato. Questo si comporta invece con la stessa chiamata .read(1). C'è un modo per readline usando il modulo subprocess senza inviare EOF a stdin?
Sono consapevole che ci sono altre biblioteche che potrebbero risolvere il mio problema e sto esaminando anche loro. Per questa domanda, sono solo curioso di subprocesssapere se ha questa capacità e come ottenerla subprocess.
Risposte
Il problema è con il buffering. Puoi usare bufsize=1se usi anche universal_newlines=True(anche se dovresti scrivere stringhe invece di byte):
p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE,
bufsize=1, universal_newlines=True)
p.stdin.write("foobaz!\n")
print(p.stdout.readline())
Quanto sopra è testato in Python 3.5.2. Nota: ho letto separatamente una risposta a una domanda non correlata che suggerisce che nelle versioni più recenti di Python text=Trueè equivalente a universal_newlines=True, ma non ho un'installazione più recente con cui provarlo al momento della scrittura.