Unix less(1)を使って端末にテキストを表示するプログラムを書いています。関連部分は次のとおりです。less(1)のサブプロセスを終了した後に入力が失敗する
私はKeyboardInterrupt例外を待ち受けています。もし私が1つを捕まえると、私はSIGTERMシグナルで少しを殺し、私のプログラムを終了します。
これが起こると、私はシェルプロンプトに戻りますが、シェルはもはや私が書いていることをエコーしませんし、再び動作させるためにはリセット(1)をしなければなりません。
どのように私は墓に私のstdinを取ることなく死ぬことを減らすためのアイデアですか?完全なソースがhttps://github.com/jforberg/rfc/blob/master/rfc.py
EDITで提供されています:いくつかの実験をした後、私はデフォルトでは(1)より少ないと男性(1)の両方を制御-Cストロークを無視することを見出しました。だから、単にそれを無視することは実行可能な選択肢かもしれません。私はそれがそれを行う適切な方法だと私は確信していないので、もし誰かが私はまだ非常に興味を持っている提案があります。
が#!/usr/bin/env python
from subprocess import PIPE, Popen
p = Popen(['less'], stdin=PIPE)
try:
p.communicate(''.join("%d\n" % i for i in range(1000)))
except KeyboardInterrupt:
print("Press `q` to exit.")
p.wait()
安価な回避策として、スクリプトの最後に 'os.system( 'reset')'を置くことができます。適切な解決策は、おそらく控えめに「控えめ」に止めること、つまり、sigintを書き、それに「q」を書いて、それが完了するのを待つことです。 – wim
@ウィムあなたの「適切な解決策」:もちろん!自分自身に「q」を書くという考えは私には起こりませんでした。 Linuxをプログラミングしていても、すべてがファイルであることを忘れないでください。それを答えに移してください。私はそれを受け入れます。 – jforberg
'setpgid'トリックがないので、' less'はあなたのPythonプロセスと同じプロセスグループになければならないので、あなたのPythonプロセスと同じ^ Cを受け取ります。しかし、それは独自の特別な処理をしようとしていると思います... '-e'(' --quit-at-eof')を使用して、プログラムがハングアップした後に終了するのはどうですか? – ephemient