2009-12-12 1 views
5

私はPythonプロセスにUNIXのコマンドラインから書きます。私はEOFを送りたい(Pythonは私の入力を読み込むことができるように、または何らかの形で標準入力バッファをフラッシュします。)EOFをコマンドラインからPython sys.stdinに送信するには? CTRL-Dが機能しません

私はCTRL-Cをヒットした場合、私はKeyboardErrorを取得します。

私がCTRL-Dを押すと、プログラムは停止します。

スタンダードバッファをフラッシュするにはどうすればよいですか?

+2

Enterキーを押すとすぐに、入力がPythonに送信されます。 –

+0

その動作を変更したい場合、Pythonは端末の設定を変更する必要があります。これは黒い魔法です...おそらく 'termios'モジュールを参照してください。とにかくバッファされています:http://docs.python.org/library/termios.html –

答えて

1

'for sys.stdin'を使用すると、バッファリングされます。

あなたは使用することができます。

while 1: 
    l = sys.stdin.readline() 
+0

両者には違いはありません。 –

+0

実際、上記は私のために働いた。 私は、sys.stdin.readline()はそうではありませんが、 'sys.stdinのために'は余分な内部バッファを持っていると私はメーリングリストを読むと思います。 –

+2

@JasonOrendorff:実際には[read-ahead buffer bug](http://bugs.python.org/issue3907)のためにPython 2に違いがあります。これを回避するには、 'iter(sys.stdin.readline、 ''):'でfor行を使用できます。 'cat |を実行しよう! python2 -u -c "" 'を使用して、入力を入力します。 'readline()'の変種は、行がすぐに利用できるようにします。 – jfs

11

コントロール-Dはあなたのプログラムが「ちょうど停止」にするべきではありません - それは標準入力を閉じる必要があり、それを使用してプログラムのお得な情報を適切に、それは完璧に続行可能性がある場合それは必要!例えば

、次st.pyを与えられた:

import sys 

def main(): 
    inwas = [] 
    for line in sys.stdin: 
    inwas.append(line) 
    print "%d lines" % len(inwas), 
    print "initials:", ''.join(x[0] for x in inwas) 

if __name__ == '__main__': 
    main() 

制御-Dは、3行目に入力した直後にヒットした場合、我々は

$ python st.py 
nel mezzo del cammin di nostra vita 
mi ritrovai per una selva oscura 
che la diritta via era smarrita 
3 lines initials: nmc 
$ 

のようなものを見ることができました - プログラムを標準入力が完了したことを認識し、必要な後処理をすべてきちんとした適切なものとして実行します。

あなたのプログラムがコントロールDで途中で終了した場合は、ひどくコード化されていなければなりません。あなたが考えることができる最小の「誤動作」プログラムを追加するために質問してください。違う?

2

私は何が起こっているのか知っていると思います。あなたはを打つことなくctrl-Dを打っています。プログラムに行を送りたい場合は、単にenterを押してください。 に達することなくctrl-Dにヒットした場合は、ctrl-Dを再度押してプログラムにその行が表示されます。この場合(2つ連続して)、行末に改行が表示されません。

import sys 

for line in sys.stdin: 
    sys.stdout.write('%s' % line) 

そして、私はそれを実行します:

$ python a.py 

そして、次のように入力します。たとえば

は、のは、私はPythonスクリプトa.pyを持っているとしましょう

line 1 
line 2<ctrl-D><ctrl-D> 

プログラム印刷されます:

line 1 
line 2$ 

$はシェルプロンプトです。上記の入力と完全なセッションがあります:

$ python a。PY
ライン1
ライン2 LINE1
ライン2 $

太字は、プログラムの出力を示しています。ローマの場合は、私が入力した内容を示すためのもので、2つのctrl-DのSANS)

これが起こっていない場合は、自分が行っていることについてもっと詳しく教えてください。

1
try: 
    # You might be inside the while-loop 
    foo = raw_input('Spam: ') # Or whatever... 
except EOFError: 
    print 'And now for something completely different.' 
    sys.exit() 
関連する問題