2017-10-27 23 views
0

私のコードは次のとおりです。私はそれを実行しようとするとsys.stdin.read()を使用すると、なぜキーボードから入力できないのですか?次のように

def function(a, b): 
    while a != 0 and b != 0: 
     ... 

    return x 

if __name__ == "__main__": 
    input = sys.stdin.read() 
    a, b = map(int, input.split()) 
    print(function(a, b)) 

、プログラムは私に入力する機会を与えるものではありません。

ValueError: not enough values to unpack (expected 2, got 0) 

enter image description here

は、誰かが私に理由を教えてもらえますし、私は私のプログラムをテストするために入力を行うことができる方法:

は、私は、次のトレースバックメッセージが表示されます。

ありがとうございます。

+3

「入力」を使用していない特別な理由はありますか? –

+1

どのようにあなたのプログラムを実行しましたか? –

+0

私はそれをオンライングレーダーにアップロードしなければならないので、インプットメソッドをそのままにしておく必要があります。プログラムはグレーダーで正常に実行され、結果が得られます。私はちょうど私自身の入力でローカルにテストしたいです。 –

答えて

0

sys.stdin.read()は、EOFに達するまでstdinと表示されます。通常、これは、そのストリームが他端(つまり、入力を提供するもの)によって閉じられるときに発生します。

これはcat inputfile.txt | your_programのようなプログラムを実行する場合に機能します。しかし、stdinが端末に接続されている場合は、対話モードで無限に読み続けるので、もう一方の端末から閉じるには端末を閉じるしかありません。

は、厳密には、WindowsでのUnixで Ctrl-DCtrl-Zで単独行にEOF文字を入力することにより read()停止させることができ、話す - これは通常のPythonコンソールで動作します。しかし、IPythonでは、このテクニックはうまくいきません。Windowsでは、を \x04Ctrl-Zと空白行として表示し、どちらも読み込みを停止しません(これはバグかデザインによって決まります)。

ので、入力の代わりに

  • 使用input()単線​​、または
  • あなたが入力の複数の行を必要とする場合、stdinから読み込まれるどのくらいに制限を置くものを使用します。

    ​​

    このようにして、空白行を入力することにより、プログラムが入力を要求するのを止めることができます。

  • 最後に、入力がインタラクティブかどうかによって異なるコードを呼び出すことができるsys.stdin.isatty()があります(ただし、あなたのタスクでは、これはおそらく過剰です)。

+1

これは当てはまりません。 'sys.stdin.read()'を使うことができます。これはEOFまで読み込みます。 Enterを押してからcltr-dを押すと、例えばOSX上でEOFを与えることができます。ほとんどのLinux/UnixフレーバーはCTRL-dをEOFとして解釈すると思います。 –

+0

@ juanpa.arrivillaga私はそれに着きました。はい、できますが、IPythonではできません。 –

+0

私はこれをIpythonシェルで全面的にテストしてきました。 –

関連する問題