cmd モジュールを使用して Python 3.5 アプリケーションを作成しました。最後に実装したいのは、CTRL-C (sigint) シグナルの適切な処理です。多かれ少なかれ Bash と同じように動作するようにしたいと思います。
- カーソルのある位置に ^C を表示
- 入力テキストが削除されるようにバッファをクリアします
- 次の行にスキップし、プロンプトを出力して、入力を待ちます
基本的:
/test $ bla bla bla|
# user types CTRL-C
/test $ bla bla bla^C
/test $
実行可能なサンプルとして簡略化されたコードを次に示します。
import cmd
import signal
class TestShell(cmd.Cmd):
def __init__(self):
super().__init__()
self.prompt = '$ '
signal.signal(signal.SIGINT, handler=self._ctrl_c_handler)
self._interrupted = False
def _ctrl_c_handler(self, signal, frame):
print('^C')
self._interrupted = True
def precmd(self, line):
if self._interrupted:
self._interrupted = False
return ''
if line == 'EOF':
return 'exit'
return line
def emptyline(self):
pass
def do_exit(self, line):
return True
TestShell().cmdloop()
これはほとんど機能します。CTRL-C を押すと、カーソル位置に ^C が出力されますが、それでも Enter キーを押す必要があります。次に、メソッドはハンドラーによって設定されたフラグにprecmd
気づき、空の行を返します。self._interrupted
これは私が取ることができる限りですが、どうにかしてそれを押す必要がないようにしたいと思います。
どうにかして を強制的に戻す必要があると思いinput()
ますが、アイデアはありますか?