web-dev-qa-db-ja.com

Python 3:EOF行を読むとき(Sublime Text 2は怒っている)

while True:
    reply = input('Enter text')
    if reply == 'stop': break
    print(reply.upper())

結果は次のとおりです。

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]

Sublime Text 2のみです。IDLEを試し、コマンドラインを試しました。すべて完璧です。 Sublemeが私に叫ぶ必要があるのはなぜですか?

ちなみに、多分あなたは私のようなEOFがそのような状況で意味するかもしれないことを説明することができます。もちろん、EOF入力から読み取ると、適切なエラーが発生しますこの状況をモデル化したいと思います入力はキーボードのみですか?はいの場合、EOFを取得するにはどのキーの組み合わせを入力すればよいですか?

前もって感謝します。

33
Kifsif

同じ問題がありました。 Sublime Textのデフォルトコンソールの問題は、入力をサポートしていないことです。

これを解決するには、SublimeREPLというパッケージをインストールする必要があります。 SublimeREPLは、入力を受け付けるPythonインタープリターを提供します。

ソリューションを詳細に説明する 記事 があります。

SublimeREPLのGitHubページ

35
Raghav Mujumdar

help(input)は、どのキーボードショートカットがEOFを生成するか、つまりUnixを示します。 Ctrl-D、Windows: Ctrl-Z+Return

input([プロンプト])->文字列

標準入力から文字列を読み取ります。末尾の改行は削除されます。ユーザーがEOF(Unix:Ctl-D、Windows:Ctl-Z + Return)を押すと、EOFErrorが発生します。Unixでは、GNUプロンプト文字列(指定されている場合)は、読み取る前に末尾の改行なしで出力されます。

空のファイルを使用して再現できます:

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

読み取り用の空のファイルとして_/dev/null_またはnul(Windows)を使用できます。 _os.devnull_は、OSで使用される名前を示します。

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

注:input()は、ファイル/パイプからの入力を喜んで受け入れます。 stdinを端末に接続する必要はありません。

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

コードでEOFErrorを処理します:

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

または、スクリプトを実行するときに空でない入力を提供するようにエディターを構成します(たとえば、許可されている場合はカスタマイズされたコマンドラインを使用します)_python3 "%f" < input_file_

10
jfs

EOFは、入力の終了を意味する特別な帯域外信号です。これは文字ではありませんが(古いDOS時代では、0x1BはEOFのように振る舞いました)、むしろ入力が終了したというOSからのシグナルです。

Windowsでは、コマンドプロンプトでCtrl+Zを押すことにより、EOFを「入力」できます。これは、実行中のプログラムにEOFを提示する入力ストリームを閉じるように端末に通知します。他のOSまたは端末エミュレータでは、EOFは通常Ctrl+Dを使用して通知されることに注意してください。

Sublime Text 2の問題に関しては、Sublime内でプログラムを実行するときにstdinが端末に接続されていないため、プログラムは空のファイル(おそらくnulまたは/dev/null)。 Python 3.1およびSublime Text 2エラー も参照してください。

10
nneonneo

現在のところ、唯一の解決策はSublimeREPLをインストールすることです。

Raghavの答えを拡張するには、入力でスクリプトを実行するたびに[ツール]-> [SublimeREPL]-> [Python]-> [実行]コマンドに移動するのは非常に面倒なので、便利なキーバインドを考案しました。 :

有効にするには、[設定]-> [キーの割り当て-ユーザー]に移動し、そこにコピーします:

[
    {"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"
        }
    },
]

当然、ショートカットを好きなものに変更するには、「キー」引数を変更する必要があります。

5
Matthew R.