1

多くのpythonスクリプトを呼び出すために使用しているシェルスクリプトがあります。シェル スクリプトにトラップを追加して、ctrl+c をキャッチして終了しました。しかし、Python スクリプトが実行されているときに ctrl+c を押すと、実行されていた Python スクリプトのブロックも表示されます! 私はそれを望んでいません。Python スクリプトに KeyboardInterrupt を追加するのがより良い方法であることはわかっていますが、それには多くの労力がかかります。ctrl+c を押すと、スクリプトの実行を制御してサイレントに終了するようなソリューションが必要です。

例: a.sh:

   control_c() {
    echo
    echo 'Keyboard Interrupt'
    exit
}
trap control_c INT
python b.py

b.py:

from time import sleep
sleep(50)

a.sh を実行して ctrl+c を押したときに、次のような python ブロックを表示したくありません。

^CTraceback (most recent call last):
  File "b.py", line 3, in <module>
    sleep(50)
KeyboardInterrupt

Keyboard Interrupt

シンプルな「キーボード割り込み」メッセージで終了したい。

4

2 に答える 2

1

これが良い習慣かどうかはわかりませんが、必要な場合sleepは try / except ステートメントでラップしてください。

try:
    sleep(50)
except KeyboardInterrupt:
    pass

OPコメントのため編集:

KeyboardInterrupt をキャッチする Python ラッパーを実行できます。かなり汚れていますが、次のようなことができます。

import imp
try:
    imp.load_source('module.name', '/path/to/script.py')
except KeyboardInterrupt:
    exit()

あなたのpythonファイル(/path/to/script.py)はlibではなく、ロード時に実行されるスクリプトであるため、1層上のエラーをキャッチして、より一般的な方法で実行できます。あなたは確かに私が思う他の問題に対処しなければならないでしょうが、私はその仕事をするべきです.

imp と Python ライブラリのロード方法の詳細については、この質問を確認してください。

于 2016-11-28T14:06:48.353 に答える
0

標準出力を /dev/null に配置するだけです

#!/usr/bin/env bash

control_c() {
    echo
    echo "Keyboard Interrupt"
    exit
}

trap control_c INT
python b.py 2>/dev/null
于 2016-11-28T14:03:58.150 に答える