2009-06-08 38 views
16

Tôi đang cố gắng đọc các đường từ một đường ống và xử lý chúng, nhưng tôi đang làm điều gì đó ngớ ngẩn và tôi không thể tìm ra cái gì. Nhà sản xuất sẽ tiếp tục sản xuất dòng vô thời hạn, như thế này:Python - đọc các dòng đơn giản từ một đường ống

producer.py

import time 

while True: 
    print 'Data' 
    time.sleep(1) 

Người tiêu dùng chỉ cần kiểm tra xem có dòng định kỳ:

consumer.py

import sys, time 
while True: 
    line = sys.stdin.readline() 
    if line: 
     print 'Got data:', line 
    else: 
     time.sleep(1) 

Khi tôi chạy điều này trong vỏ Windows là python producer.py | python consumer.py, nó chỉ ngủ mãi mãi (không bao giờ có vẻ để có được dữ liệu?) Có vẻ như có lẽ vấn đề là sản phẩm ucer không bao giờ chấm dứt, vì nếu tôi gửi một lượng dữ liệu hữu hạn thì nó hoạt động tốt.

Làm cách nào để nhận dữ liệu và hiển thị cho người tiêu dùng? Trong ứng dụng thực tế, nhà sản xuất là một chương trình C++ mà tôi không kiểm soát được.

Trả lời

16

Một số phiên bản cũ của Windows mô phỏng đường ống qua các tệp (vì vậy chúng dễ bị các vấn đề như vậy), nhưng đó không phải là vấn đề trong 10 năm trở lên. Hãy thử thêm một

sys.stdout.flush() 

cho nhà sản xuất sau khi print, và cũng cố gắng làm cho stdout của nhà sản xuất không có bộ đệm (bằng cách sử dụng python -u).

Tất nhiên điều này không giúp ích gì nếu bạn không có quyền kiểm soát nhà sản xuất - nếu nó làm quá nhiều đầu ra, bạn vẫn phải chờ một thời gian dài.

Thật không may - trong khi có nhiều cách để giải quyết vấn đề trên các hệ điều hành giống Unix, chẳng hạn như pyexpect, pexpect, exscriptparamiko, tôi nghi ngờ có một trong số chúng hoạt động trên Windows; nếu đó thực sự là trường hợp, tôi sẽ thử Cygwin, trong đó đặt đủ một veneer giống Linux trên Windows như thường cho phép sử dụng các phương pháp giống như Linux trên một hộp Windows.

7

Đây là về I/O được đệm theo mặc định bằng Python. Chuyển thông tin -u cho thông dịch viên để vô hiệu hóa hành vi này:

python -u producer.py | python consumer.py 

Khắc phục sự cố cho tôi.

+0

Bạn đã đọc câu cuối cùng của câu hỏi chưa ?? – jwg

Các vấn đề liên quan