web-dev-qa-db-ja.com

Ctrl + Cをバッチジョブから呼び出されたスクリプトに渡す方法

押すことの影響を避けようとしています 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.pyKeyboardInterruptエラーとして処理できるようにしたいと思います。今、押すと 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)?

私は次のオプションを試しました:

  1. python "%script_path%" %*start python "%script_path%" %*に置き換えます。これにより、新しいシェルが開始されます。これは、実際に私がやろうとしていることでいいです。新しいシェルで標準入力が正しく機能しているようです。しかしながら Ctrl+C 以前と同じ効果があり、新しいシェルはすぐに終了します。 exitコマンドをバッチファイルの最後に追加しても、効果がないようです。
  2. python "%script_path%" %*start /b python "%script_path%" %*に置き換えます。これは、同じシェルのバックグラウンドでジョブを開始するだけです。 Ctrl+C それでもジョブを強制終了するだけで、標準入力が正しく機能していないように見えます。

追記:

My Pythonスクリプトは、たまにsys.stdinからユーザー入力を読み取る必要があります。スクリプトは入力を読み取り、ユーザーが入力できるように処理します Ctrl+C。アイデアは、スクリプトの死を監視するだけでなく、except KeyboardInterrupt:句で意味のあることを行うことです。

3
Mad Physicist

Ctrl-CSIGINTなので、内部の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+。

1
Viktor Nonov