私はPythonプロセスにUNIXのコマンドラインから書きます。私はEOFを送りたい(Pythonは私の入力を読み込むことができるように、または何らかの形で標準入力バッファをフラッシュします。)EOFをコマンドラインからPython sys.stdinに送信するには? CTRL-Dが機能しません
私はCTRL-Cをヒットした場合、私はKeyboardErrorを取得します。
私がCTRL-Dを押すと、プログラムは停止します。
スタンダードバッファをフラッシュするにはどうすればよいですか?
私はPythonプロセスにUNIXのコマンドラインから書きます。私はEOFを送りたい(Pythonは私の入力を読み込むことができるように、または何らかの形で標準入力バッファをフラッシュします。)EOFをコマンドラインからPython sys.stdinに送信するには? CTRL-Dが機能しません
私はCTRL-Cをヒットした場合、私はKeyboardErrorを取得します。
私がCTRL-Dを押すと、プログラムは停止します。
スタンダードバッファをフラッシュするにはどうすればよいですか?
'for sys.stdin'を使用すると、バッファリングされます。
あなたは使用することができます。
while 1:
l = sys.stdin.readline()
両者には違いはありません。 –
実際、上記は私のために働いた。 私は、sys.stdin.readline()はそうではありませんが、 'sys.stdinのために'は余分な内部バッファを持っていると私はメーリングリストを読むと思います。 –
@JasonOrendorff:実際には[read-ahead buffer bug](http://bugs.python.org/issue3907)のためにPython 2に違いがあります。これを回避するには、 'iter(sys.stdin.readline、 ''):'でfor行を使用できます。 'cat |を実行しよう! python2 -u -c "
コントロール-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で途中で終了した場合は、ひどくコード化されていなければなりません。あなたが考えることができる最小の「誤動作」プログラムを追加するために質問してください。違う?
私は何が起こっているのか知っていると思います。あなたはを打つことなく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)
これが起こっていない場合は、自分が行っていることについてもっと詳しく教えてください。
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()
Enterキーを押すとすぐに、入力がPythonに送信されます。 –
その動作を変更したい場合、Pythonは端末の設定を変更する必要があります。これは黒い魔法です...おそらく 'termios'モジュールを参照してください。とにかくバッファされています:http://docs.python.org/library/termios.html –