cmdモジュールを使用してPython 3.5アプリケーションを作成しました。私が実装したい最後のことは、CTRL-C(sigint)シグナルの適切な処理です。私はそれが多かれ少なかれバッシュはそれをしないように動作したいと思います:Python cmdモジュールでCTRL-Cを処理する
- 印刷^ 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()
は誰でもアイデアを持っていますか?
これは、実行可能なサンプルを小さくするのに役立ちます。あなたのコードをどのように実行していなくても、 '' \ n ''や空白を' 'stdout''に書くだけで十分でしょうか?それはシグナルハンドラが ''^C ''の末尾に改行を張ったときです。 – tijko
@tijkoスニペットを実行可能なサンプルに置き換えてポストを編集しました。私はstdoutに改行を書くことを試みました(実際にはprintメソッドによってデフォルトで行われますが)、それはうまくいかず、どうしてでしょうか? stdinはstdoutから供給される必要がありますが、そうでない場合はパイプではありません。 – wujek
ええ、あなたは正しいです私はコマンドラインstdinプロンプトの観点から考えていませんでした。 @DanGetzはあなたのニーズに合った答えを持っています。そのクリーナーも、信号ハンドラやフラグを設定する必要はありません。あなたのコメントの後、私はstdinのリダイレクトラインに沿って考えるようになりましたが、必要に応じて調整することができます。 – tijko