Tôi muốn bắt đầu một chương trình cần vài phút để hoàn tất. Trong thời gian này, tôi muốn đọc thông báo tiến độ của chương trình (được in trên stdout). Vấn đề là tôi không thể tìm ra cách đọc đầu ra của nó trong khi chạy.Nhận thông báo tiến bộ từ một tiến trình con
Chức năng duy nhất tôi tìm thấy để đọc đầu ra của chương trình là Popen.communicate()
, nhưng phương pháp này chờ cho đến khi quá trình kết thúc. Vì vậy, nó là không thể có được sự tiến bộ và làm cho nó có thể nhìn thấy cho người sử dụng trong một cách định dạng đặc biệt.
Có thể thực hiện điều này theo cách khác không?
Khi tôi chạy quy trình với subprocess.popen
bằng tập lệnh của mình, tôi thấy đầu ra của chương trình trên màn hình. Có thể giấu nó không? (Ubuntu 10.10, thiết bị đầu cuối thông thường)
Điều gì sẽ xảy ra nếu một số dữ liệu đến sau khi bạn đã phá vỡ vòng lặp while? – Neo
@Neo: ví dụ của anh ấy vi phạm tại EOF, điều đó có nghĩa là không có thêm dữ liệu nào có thể đến sau đó. NHƯNG, để trả lời ý nghĩa của câu hỏi của bạn: nếu bạn không tiếp tục đọc đường ống stdout, bộ đệm có thể lấp đầy và tiến trình con sẽ chặn cố gắng viết stdout. – payne
Nó sẽ chờ bạn trong p.stdout để sử dụng sau này. Tuy nhiên, cuộc gọi readline sẽ chặn cho đến khi đầu vào mới đến hoặc đường ống đóng. Đã thêm một số tập lệnh mẫu. – chmullig