押すことの影響を避けようとしています Ctrl+C「バッチジョブの終了(Y/N)」の確認を抑制する方法は? と似たバッチファイルです。ただし、私の場合は、基になるスクリプトで信号を処理する必要があります。私のバッチファイルは次のようになります。
@ECHO off
setlocal
set "script_path=%~dp0"
set "script_path=%script_path%myscript.py"
python "%script_path%" %*
endlocal
すぐにプロセスを終了するのではなく、Ctrl + Cを押してmyscript.py
のKeyboardInterrupt
エラーとして処理できるようにしたいと思います。今、押すと Ctrl+C、私は得ます:
forrtl: error (200): program aborting due to control-C event
Image PC Routine Line Source
libifcoremd.dll 0FCA7CB8 Unknown Unknown Unknown
KERNELBASE.dll 76411C99 Unknown Unknown Unknown
KERNEL32.DLL 74A68484 Unknown Unknown Unknown
ntdll.dll 77C2305A Unknown Unknown Unknown
ntdll.dll 77C2302A Unknown Unknown Unknown
Terminate batch job (Y/N)?
私は次のオプションを試しました:
python "%script_path%" %*
をstart python "%script_path%" %*
に置き換えます。これにより、新しいシェルが開始されます。これは、実際に私がやろうとしていることでいいです。新しいシェルで標準入力が正しく機能しているようです。しかしながら Ctrl+C 以前と同じ効果があり、新しいシェルはすぐに終了します。 exit
コマンドをバッチファイルの最後に追加しても、効果がないようです。python "%script_path%" %*
をstart /b python "%script_path%" %*
に置き換えます。これは、同じシェルのバックグラウンドでジョブを開始するだけです。 Ctrl+C それでもジョブを強制終了するだけで、標準入力が正しく機能していないように見えます。追記:
My Pythonスクリプトは、たまにsys.stdin
からユーザー入力を読み取る必要があります。スクリプトは入力を読み取り、ユーザーが入力できるように処理します Ctrl+C。アイデアは、スクリプトの死を監視するだけでなく、except KeyboardInterrupt:
句で意味のあることを行うことです。
Ctrl-C はSIGINT
なので、内部のsignal
モジュールを使用してキャッチできますpythonスクリプト:
import signal
import time
def handler(signum, frame):
print 'Got Ctrl-C'
#you code handling the Ctrl-C
signal.signal(signal.SIGINT, handler)
# your code
Python 2.7のバグ があり、Won't fix
とマークされていたので、Python 3.3+。