web-dev-qa-db-ja.com

sys.stdin.readlines()がハングするPythonスクリプト

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

lines = sys.stdin.readlines()

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

[〜#〜]編集[〜#〜]

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

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

編集2

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

11
Bo A

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

_for line in sys.stdin:
    #do something with line
_

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

15
mgilson

何かをstdinにリダイレクトしない限り、それは予想される動作です。つまり、stdin(スクリプトを実行しているコンソール)から入力を読み取ることを意味します。ご入力をお待ちしております。

参照: "sys.stdin.readlines() inputを終了する方法?

5
Daniel DiPaolo

他の人がすでにEOFの問題に取り組んでいるので、これがあなたの質問に直接答えていないことを私は知っていますが、通常、私が見つけたものは、長いlivedサブプロセスまたはstdinはwhile/if行アプローチです:

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

この場合、sys.stdin.readline()はテキスト行を返しますbefore an EOFが返されます。一度EOF指定すると、ループからの中断をトリガーする空の行が返されます。EOFが指定されていない限り、ここでもhangが発生する可能性があります。

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

3
Jason Mock

インタラクティブセッションでプログラムを実行している場合、この行により、Python)を送信するまで、標準入力(つまりキーボード)からEOFが読み取られます。キャラクター (Ctrl-D (Unix/Mac)または Ctrl-Z (ウィンドウズ))。

>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']
3
Tim Pietzcker