Quy trình con Python Bật dòng đọc trước khi đóng stdin

Sep 07 2020
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())

Mã này hoạt động như mong đợi (mèo lặp lại stdin và chúng ta có thể đọc stdout)

Nếu chúng tôi nhận xét ra p.stdin.close(), các .readline()khối vô thời hạn. .read(1)Thay vào đó, điều này hoạt động giống như một cuộc gọi . Có cách nào để đọc dòng sử dụng mô-đun quy trình con mà không cần gửi EOF đến stdin không?

Tôi biết rằng có những thư viện khác có thể giải quyết vấn đề của tôi và tôi cũng đang xem xét chúng. Đối với câu hỏi này, tôi chỉ tò mò nếu subprocesscó khả năng này, và làm thế nào để đạt được nó thông qua subprocess.

Trả lời

1 alani Sep 07 2020 at 12:28

Vấn đề là với bộ đệm. Bạn có thể sử dụng bufsize=1nếu bạn cũng sử dụng universal_newlines=True(mặc dù sau đó bạn sẽ viết chuỗi thay vì 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())

Phần trên được thử nghiệm bằng Python 3.5.2. Lưu ý - Tôi vừa đọc riêng một câu trả lời cho câu hỏi không liên quan gợi ý rằng trong các phiên bản Python gần đây hơn text=Truetương đương với universal_newlines=True, nhưng không có bản cài đặt mới hơn để thử nó tại thời điểm viết bài.