2012-09-22 22 views
32
while True: 
    reply = input('Enter text') 
    if reply == 'stop': break 
    print(reply.upper()) 

Kết quả là:Python 3: EOF khi đọc một dòng (Sublime Văn bản 2 là tức giận)

Enter text:Traceback (most recent call last): 
    File "C:\PythonProjects\5.py", line 2, in <module> 
    reply = input('Enter text:') 
EOFError: EOF when reading a line 
[Finished in 0.2s with exit code 1] 

Nó chỉ là trong văn bản Sublime 2. Tôi cố gắng IDLE, thử lệnh dòng, mọi thứ đều hoàn hảo. Tại sao Subleme nên hét lên với tôi?

Nhân tiện, có lẽ bạn cũng có thể giải thích ý kiến ​​của tôi về EOF có thể có ý nghĩa gì trong tình huống như vậy. Tất nhiên, tôi đã đọc trong tài liệu, rằng nếu EOF được đọc từ đầu vào, lỗi thích hợp được nâng lên. Tôi muốn mô hình tình huống này. Chỉ nhập vào bàn phím? Nếu có, tôi nên nhập tổ hợp phím nào để lấy EOF?

Cảm ơn bạn trước.

+0

Không chắc chắn về phần còn lại của câu hỏi, nhưng EOF thường là 'ctrl' +' D' – AGS

Trả lời

10

EOF là tín hiệu ngoài dải đặc biệt có nghĩa là kết thúc đầu vào. Nó không phải là một nhân vật (mặc dù trong những ngày DOS cũ, 0x1B hoạt động như EOF), mà là một tín hiệu từ hệ điều hành mà đầu vào đã kết thúc.

Trên Windows, bạn có thể "nhập" một EOF bằng cách nhấn Ctrl+Z tại dấu nhắc lệnh. Điều này báo hiệu thiết bị đầu cuối đóng luồng đầu vào, hiển thị EOF cho chương trình đang chạy. Lưu ý rằng trên các hệ điều hành khác hoặc bộ mô phỏng đầu cuối, EOF thường được báo hiệu bằng cách sử dụng Ctrl+D.

Đối với vấn đề của bạn với Sublime Văn bản 2, có vẻ như stdin không kết nối với nhà ga khi chạy một chương trình trong vòng Sublime, và do đó do đó chương trình bắt đầu kết nối với một tập tin rỗng (có lẽ nul hoặc /dev/null). Xem thêm Python 3.1 and Sublime Text 2 error.

+0

Có cách nào để kết nối stdin đúng cách để bạn có thể nhập vào thiết bị đầu cuối không? – TheTedinator

+0

Tôi không đích thân sử dụng Sublime, nhưng có vẻ như đề nghị hàng đầu là cài đặt [SublimeREPL] (http://sublimerepl.readthedocs.org/en/latest/). – nneonneo

9

help(input) chương trình gì phím tắt tạo EOF, cụ thể là, Unix: Ctrl-D, Windows: Ctrl-Z + Return:

đầu vào ([prompt]) -> chuỗi

Đọc chuỗi từ đầu vào tiêu chuẩn. Dòng mới sau bị tước. Nếu người dùng truy cập EOF (Unix: Ctl-D, Windows: Ctl-Z + Return), hãy nâng cao EOFError. Trên Unix, GNU readline được sử dụng nếu được bật. Chuỗi được nhắc, nếu được cung cấp, được in mà không có dấu dòng mới trước khi đọc .

Bạn có thể tái tạo nó sử dụng một tập tin rỗng:

$ touch empty 
$ python3 -c "input()" < empty 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
EOFError: EOF when reading a line 

Bạn có thể sử dụng /dev/null hoặc nul (Windows) như một tập tin rỗng để đọc. os.devnull hiển thị tên được sử dụng bởi hệ điều hành của bạn:

$ python3 -c "import os; print(os.devnull)" 
/dev/null 

Lưu ý: input() vui vẻ chấp nhận đầu vào từ một tập tin/ống.Bạn không cần phải stdin được kết nối với thiết bị đầu cuối:

$ echo abc | python3 -c "print(input()[::-1])" 
cba 

Hoặc xử lý EOFError trong mã của bạn:

try: 
    reply = input('Enter text') 
except EOFError: 
    break 

Hoặc cấu hình soạn thảo của bạn để cung cấp một đầu vào không trống khi nó chạy script của bạn ví dụ: bằng cách sử dụng một dòng lệnh tùy chỉnh nếu nó cho phép nó: python3 "%f" < input_file

32

Tôi đã có cùng một vấn đề. Vấn đề với bảng điều khiển mặc định của văn bản Sublime là nó không hỗ trợ đầu vào.

Để giải quyết, bạn phải cài đặt gói có tên SublimeREPL. SublimeREPL cung cấp một trình thông dịch Python chấp nhận đầu vào.

Có một số article giải thích chi tiết giải pháp.

GitHub page for SublimeREPL

5

Dường như bây giờ, giải pháp duy nhất vẫn là cài đặt SublimeREPL.

Để mở rộng câu trả lời của Raghav, có thể khá phiền phức khi phải đi vào lệnh Tools-> SublimeREPL-> Python-> Run mỗi lần bạn muốn chạy tập lệnh với đầu vào, vì vậy tôi đã tạo ra một ràng buộc khóa nhanh mà bạn có thể có ích:

để kích hoạt nó, hãy vào Preferences-> Nối kết phím - dùng, và sao chép này trong đó:

[ 
    {"keys":["ctrl+r"] , 
    "caption": "SublimeREPL: Python - RUN current file", 
    "command": "run_existing_window_command", 
    "args": 
     { 
      "id": "repl_python_run", 
      "file": "config/Python/Main.sublime-menu" 
     } 
    }, 
] 

Đương nhiên, bạn sẽ chỉ phải thay đổi lập luận "chìa khóa" để thay đổi phím tắt thành bất cứ điều gì bạn muốn.

-2
try: 
    value = raw_input() 
    do_stuff(value) # next line was found 
except (EOFError): 
    break #end of file reached 

Điều này có vẻ là cách sử dụng đúng của raw_input khi xử lý hết dòng đầu vào từ đầu vào đường ống. [Tham khảo bài đăng này] [1]

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