Wie übergeben Sie Strg + C an das vom Stapeljob aufgerufene Skript

483
Mad Physicist

Ich versuche, die Auswirkungen des Einpressens Ctrl+Ceiner Batch-Datei in ähnlicher Weise wie die Bestätigung "Batch-Job (J / N) beenden" zu unterdrücken. . In meinem Fall möchte ich jedoch, dass das Signal von meinem zugrunde liegenden Skript verarbeitet wird. Meine Batch-Datei sieht folgendermaßen aus:

@ECHO off setlocal set "script_path=%~dp0" set "script_path=%script_path%myscript.py" python "%script_path%" %* endlocal 

Ich möchte in der Lage sein, Strg + C zu drücken und es als KeyboardInterruptFehler zu behandeln, myscript.pyanstatt den Prozess sofort zu beenden. Wenn ich jetzt drücke Ctrl+C, bekomme ich:

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)? 

Ich habe folgende Möglichkeiten ausprobiert:

  1. Ersetzen python "%script_path%" %*durch start python "%script_path%" %*. Dies startet eine neue Shell, was eigentlich gut ist mit dem, was ich versuche. Die Standardeingabe scheint in der neuen Shell ordnungsgemäß zu funktionieren. Hat Ctrl+Cjedoch den gleichen Effekt wie zuvor und die neue Hülle stirbt sofort ab. Das Anhängen eines exitBefehls an das Ende der Batchdatei scheint ebenfalls keine Auswirkung zu haben.
  2. Ersetzen python "%script_path%" %*durch start /b python "%script_path%" %*. Dadurch wird der Job im Hintergrund in derselben Shell gestartet. Ctrl+CDer Job wird immer noch beendet, und die Standardeingabe scheint nicht richtig zu funktionieren.

Zusätzliche Anmerkung:

Mein Python-Skript muss gelegentlich Benutzereingaben lesen sys.stdin. Das Skript liest einige Eingaben und verarbeitet sie dann so, dass der Benutzer darauf zugreifen kann Ctrl+C. Die Idee ist, etwas Sinnvolles in der except KeyboardInterrupt:Klausel zu tun, anstatt nur das Skript zu sterben.

1

1 Antwort auf die Frage

0
Viktor Nonov

Ctrl- Cist SIGINTso können Sie es mit Hilfe der Fang signalModul innerhalb Sie Python - Skript:

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 

Denken Sie daran, dass in Python 2.7 für Windows ein FehlerWon't fix aufgetreten ist, der als markiert wurde. Daher sollten Sie Python 3.3+ verwenden.

Zum Glück verwende ich 3.6. Werde das testen und akzeptieren, ob es funktioniert. Mad Physicist vor 5 Jahren 0