13

Pythonスクリプトを実行するたびに、次の行でハングしているように見えます。

lines = sys.stdin.readlines()

これを修正/回避するにはどうすればよいですか?

編集

これが私がやっていることですlines

lines = sys.stdin.readlines()
updates = [line.split() for line in lines]

編集2

私はこのスクリプトをgitフックから実行しているので、とにかくEOFの周りにありますか?

4

4 に答える 4

17

これは、達成しようとしていることに大きく依存します。あなたはできるかもしれません:

for line in sys.stdin:
    #do something with line

もちろん、このイディオムと使用しているreadlines()方法では、何らかの形で EOF 文字をスクリプトに送信して、ファイルを読み取る準備ができていることを認識させる必要があります。(UNIX では、通常 Ctrl-D でうまくいきます)。

于 2012-08-03T16:07:21.923 に答える
6

何かをリダイレクトしない限り、stdin期待される動作になります。stdinこれは、 (スクリプトを実行しているコンソールから)入力を読み取ることを意味します。あなたの入力を待っています。

参照: 「入力を終了するにはsys.stdin.readlines()?

于 2012-08-03T16:07:53.540 に答える
3

他の人がすでにEOFの問題に対処しているため、これがあなたの質問に直接答えているわけではないことはわかっていますが、通常、長期間存続するサブプロセスまたは標準入力からライブ出力を読み取るときに最適に機能することがわかったのは、 while/if 行アプローチです。

while True:
    line = sys.stdin.readline()
    if not line:
       break
    process(line)

この場合、sys.stdin.readline() は、EOF が返される前にテキスト行を返します。EOF が指定されると、空の行が返され、ループからのブレークがトリガーされます。EOF が提供されない限り、ここでもハングが発生する可能性があります。

サブプロセス/標準入力がまだ実行されている間に「ライブ出力」を処理する機能には、書き込みアプリケーションがその出力をフラッシュする必要があることに注意してください。

于 2012-08-03T16:40:07.007 に答える
3

Ctrl対話型セッションでプログラムを実行している場合、この行により、Python は、EOF 文字 ( - D(Unix/Mac) またはCtrl- Z(Windows))を送信するまで、標準入力 (つまり、キーボード) から読み取ります。

>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']
于 2012-08-03T16:08:26.673 に答える