2010-11-15 32 views
7

Tôi đang cố gắng để chuyển đổi đầu ra của vmstat vào một tập tin CSV sử dụng Python, vì vậy tôi sử dụng một cái gì đó như thế này để chuyển đổi sang CSV và thêm ngày tháng và thời gian như coloumns:Ống streaming bằng Python

vmstat 5 | python myscript.py >> vmstat.log 

Vấn đề tôi gặp phải là nó chặn trong khi cố gắng lặp lại sys.stdin. Có vẻ như bộ đệm đầu vào không bị xóa. Tôi không muốn vòng quanh vô tận và đốt cháy thời gian xử lý như tôi đang cố gắng đo lường điều này. Đây là một cuộc biểu tình đơn giản được chặn trên dòng 3:

import sys 

for line in sys.stdin: 
    sys.stdout.write(line) 
    sys.stdout.flush() 

Có cách nào dễ dàng truy cập luồng ngay lập tức như grep không, mà không tạm dừng khi bộ đệm đầu vào đầy?

Trả lời

7

VMstat 5, không đóng bộ đệm, vì vậy bộ đệm python vẫn đang chờ thêm dữ liệu.

Sử dụng này để thay thế:

for line in iter(sys.stdin.readline, ""): 
    print line 
+0

grep có thể làm điều đó, ví dụ 'vmstat 5 | grep 0' sẽ vui vẻ in các dòng có chứa 0 đến stdout –

+2

Có, bạn chỉ cần thay đổi cách đọc từ stdin xem chỉnh sửa – fabrizioM

+1

Giải pháp này hoạt động, cảm ơn bạn! –