2013-03-27 26 views
5

Tôi có đoạn code sau trong program.py:sys.stdin không đóng trên ctrl-d

from sys import stdin 
for line in stdin: 
    print line 

tôi chạy, nhập dòng, và sau đó nhấn Ctrl + D, nhưng chương trình không thoát.

này không làm việc:

$ printf "echo" | python program.py 

Tại sao chương trình không thoát ra khi tôi bấm Ctrl + d? Tôi đang sử dụng thiết bị đầu cuối Fedora 18.

+0

Bạn đang sử dụng trình bao nào? – squiguy

+0

Ồ, và bạn cần nhập 'CTRL-D' hai lần. –

+0

Và nhập 'CTRL-D' hai lần không hoạt động. –

Trả lời

13

Ctrl + D có hiệu ứng lạ. Nó không đóng luồng đầu vào, nhưng chỉ gây ra mức C fread() để trả lại kết quả trống. Đối với các tệp thông thường, kết quả có nghĩa là tệp hiện đang ở cuối tệp nhưng có thể chấp nhận được để đọc thêm, ví dụ: để kiểm tra xem liệu có ai đó đã ghi thêm dữ liệu vào tệp trong thời gian chờ đợi hay không.

Ngoài ra, có vấn đề về đệm --- ba cấp độ trong số đó!

  • Lặp lại của Python qua tệp sẽ chặn chặn. Tránh nó đọc từ các luồng tương tác.

  • tệp stdin cấp C có, theo mặc định, một bộ đệm dòng.

  • nhà ga chính (!), Trong chế độ mặc định của nó ("Chế độ nấu chín"), đọc một dòng dữ liệu trước khi gửi nó đến quá trình, điều này giải thích tại sao gõ Ctrl +D không có bất kỳ hiệu ứng nào khi gõ vào giữa một dòng.

Ví dụ này tránh được vấn đề đầu tiên, đó là tất cả các bạn cần nếu tất cả các bạn muốn là phát hiện Ctrl + D gõ như một dòng riêng:

import sys 

while True: 
    line = sys.stdin.readline() 
    print repr(line) 

Bạn nhận được tất cả phù hợp với số '\n' cuối cùng, ngoài khi "dòng" xuất phát từ một số Ctrl + D, trong trường hợp này, bạn chỉ nhận được '' (nhưng vẫn tiếp tục đọc, trừ khi tất nhiên chúng tôi thêm if line == '': break).

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