Verwalten des Tastaturalarms bei der Verwendung von Unterprofilen

Ich habe Python-Skript namens monitiq_install.py die andere Scripts (oder Module) mit dem subprocess Python-Modul aufruft. Allerdings, wenn der Benutzer sendet eine Tastatur Interrupt (STRG + C) es beendet, aber mit einer Ausnahme. Ich möchte, dass es aussteigt, aber schön.

Mein Code:

  • ImportError:: Symbol nicht gefunden: __PyErr_ReplaceException
  • Das Speichern von Scatterplot-Animationen mit matplotlib erzeugt leere Videodateien
  • Python-Flask-Anwendung kann nicht von Remote-Computern im Netzwerk abgerufen werden
  • 1D-Numpy-Array, das für jede aufeinanderfolgende Zeile in einem neuen 2D-Array nach rechts verschoben wird
  • Hintergrundfunktion in Python
  • Homebrew, python installieren
  •  import os import sys from os import listdir from os.path import isfile, join from subprocess import Popen, PIPE import json # Run a module and capture output and exit code def runModule(module): try: # Run Module process = Popen(os.path.dirname(os.path.realpath(__file__)) + "/modules/" + module, shell=True, stdout=PIPE, bufsize=1) for line in iter(process.stdout.readline, b''): print line, process.communicate() exit_code = process.wait(); return exit_code; except KeyboardInterrupt: print "Got keyboard interupt!"; sys.exit(0); 

    Der Fehler, den ich bekomme, ist unten:

     python monitiq_install.py -a Invalid module filename: create_db_user_v0_0_0.pyc Not Running Module: '3parssh_install' as it is already installed ###################################### Running Module: 'create_db_user' Version: '0.0.3' Choose username for Monitiq DB User [MONITIQ] ^CTraceback (most recent call last): File "/opt/monitiq-universal/install/modules/create_db_user-v0_0_3.py", line 132, in <module> inputVal = raw_input(""); Traceback (most recent call last): File "monitiq_install.py", line 40, in <module> KeyboardInterrupt module_install.runModules(); File "/opt/monitiq-universal/install/module_install.py", line 86, in runModules exit_code = runModule(module); File "/opt/monitiq-universal/install/module_install.py", line 19, in runModule for line in iter(process.stdout.readline, b''): KeyboardInterrupt 

    Eine Lösung oder einige Hinweise wäre hilfreich 🙂

    –EDIT Mit versuchen Fang

     Running Module: 'create_db_user' Version: '0.0.0' Choose username for Monitiq DB User [MONITIQ] ^CGot keyboard interupt! Traceback (most recent call last): File "monitiq_install.py", line 36, in <module> module_install.runModules(); File "/opt/monitiq-universal/install/module_install.py", line 90, in runModules exit_code = runModule(module); File "/opt/monitiq-universal/install/module_install.py", line 29, in runModule sys.exit(0); NameError: global name 'sys' is not defined Traceback (most recent call last): File "/opt/monitiq-universal/install/modules/create_db_user-v0_0_0.py", line 132, in <module> inputVal = raw_input(""); KeyboardInterrupt 

  • Pydev debugger: nicht in der Lage, echte Location für Python 2.7 nach OS 10.8 Upgrade zu finden
  • In Regex, was bedeutet \ w * bedeuten?
  • Unicode oder was in Matplotlib?
  • Wie man an eine Tabelle in BigQuery mit Python BigQuery API anhängt
  • Zwei sortierte Arrays, Summe von 2 Elementen gleich einer bestimmten Zahl
  • Tkinter - einfaches Programm wird nicht aktualisiert
  • 2 Solutions collect form web for “Verwalten des Tastaturalarms bei der Verwendung von Unterprofilen”

    Wenn Sie in einem Terminal Strg + C drücken, wird SIGINT an den gesamten Kinderprozess innerhalb der Prozessgruppe gesendet. Siehe Kind-Prozess empfängt Eltern SIGINT .

    Das ist der Grund, warum du den Traceback aus dem Child-Prozess trotz try / except KeyboardInterrupt in der übergeordneten Person siehst.

    Sie könnten die Stderr-Ausgabe aus dem Kind-Prozess unterdrücken: stderr=DEVNULL . Oder starten Sie es in einer neuen Prozessgruppe: start_new_session=True :

     import sys from subprocess import call try: call([sys.executable, 'child.py'], start_new_session=True) except KeyboardInterrupt: print('Ctrl C') else: print('no exception') 

    Wenn du start_new_session=True im obigen Beispiel start_new_session=True dann kann KeyboardInterrupt auch im Kind angehoben werden und du kannst das start_new_session=True bekommen.

    Wenn subprocess.DEVNULL nicht verfügbar ist; Du DEVNULL = open(os.devnull, 'r+b', 0) . Wenn der Parameter start_new_session nicht verfügbar ist; Sie können preexec_fn=os.setsid auf POSIX verwenden.

    Sie können dies mit versuchen und außer wie unten:

     import subprocess try: proc = subprocess.Popen("dir /S", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) while proc.poll() is None: print proc.stdout.readline() except KeyboardInterrupt: print "Got Keyboard interrupt" 

    Sie könnten vermeiden shell=True in Ihrer Ausführung als beste Sicherheit Praxis.

    Python ist die beste Programmiersprache der Welt.