8

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()ますが、アイデアはありますか?

4

1 に答える 1