Python subproses Popen readline sebelum menutup 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())
Kode ini berfungsi seperti yang diharapkan (kucing menggemakan stdin, dan kita dapat membaca stdout)
Jika kita mengomentari p.stdin.close(), .readline()blok tanpa batas. Ini berperilaku panggilan yang sama .read(1)sebagai gantinya. Apakah ada cara untuk readline menggunakan modul subprocess tanpa mengirimkan EOF ke stdin?
Saya sadar ada perpustakaan lain yang mungkin memecahkan masalah saya, dan saya juga sedang memeriksanya. Untuk pertanyaan ini, saya hanya ingin tahu apakah subprocessmemiliki kemampuan ini, dan bagaimana cara mencapainya subprocess.
Jawaban
Masalahnya ada pada buffering. Anda dapat menggunakan bufsize=1jika Anda juga menggunakan universal_newlines=True(meskipun Anda kemudian akan menulis string, bukan 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())
Di atas diuji dengan Python 3.5.2. Catatan - Saya baru saja membaca jawaban untuk pertanyaan yang tidak terkait yang menyarankan bahwa dalam versi Python yang lebih baru text=Truesetara universal_newlines=True, tetapi tidak memiliki instalasi yang lebih baru untuk mencobanya pada saat penulisan.