PowerShell nach STRG-Unterbrechung offen halten

10

Ich arbeite mit Python Django in Windows Vista Powershell. Nachdem ich ausgeführt habe python manage.py runserver, werde ich aufgefordert CTRL-BREAK, den Vorgang zu stoppen. Aber nachdem ich das eingegeben habe, stoppt Powershell den Prozess und schließt. Gibt es eine Möglichkeit, den Prozess zu stoppen und die Powershell offen zu halten?

GTyler
quelle
Diese Standardeinstellung für Django-Windows ist aus vielen Gründen schrecklich (z. B. weil viele Laptops und sogar die integrierte virtuelle Tastatur keine Unterbrechungstaste haben). Ich wünschte, ich könnte eine Lösung finden.
Mortoc
Python lügt oft darüber, was zu tun ist, um einen Prozess zu beenden / zu stoppen. Sie können aber auch andere STRG- <Optionen> ausprobieren. Zum Beispiel: STRG-C / Z / D
not2qubit
@ user1147688 Strg + Pause beendet den Python-Interpreter unter Windows sofort, während Strg + C abgefangen oder ignoriert werden kann.
Smit Johnth

Antworten:

3

Leider beendet der PowerShell-Konsolenhost Ctrl+Ceinen laufenden Vorgang und Ctrl+Breakbeendet den Vorgang UND schließt die Hostsitzung. Es ist meiner Meinung nach eine sehr unglückliche Wahl, aber sie ist da und wir können damit leben.

Ich finde es am einfachsten, wenn ich auf Situationen wie diese stoße, die aus der PowerShell-Sitzung stammen und einfach cmdüber die PowerShell-Eingabeaufforderung ausgeführt werden. Jetzt umgehe ich PowerShell vorübergehend und kehre nach Abschluss problemlos zu meiner PowerShell-Sitzung zurück.

Die andere Sache, die Sie wahrscheinlich in Betracht ziehen sollten, ist die Verwendung von cmd.exe anstelle von PowerShell, es sei denn, es gibt eine Funktion von PowerShell, die Sie nutzen möchten.

Greg Wojan
quelle
1

Sie können es folgendermaßen versuchen:

  1. Ihre Powershell startet Ihr Python-Programm in einem Job

  2. Trap Ctrl-C durch den Powershell-Hauptprozess

  3. Wenn Strg-C abgefangen ist, stoppen Sie den in Schritt 1 gestarteten Job

Dann können Sie Ihr Powershell-Skript fortsetzen

  1. Verwenden Sie den Startjob, um einen Hintergrundjob zu starten

    $ killMe = start-job -scriptblock {& python manage.py}

  2. Um Strg-C abzufangen, weisen Sie Ihre Konsole an, Strg-C als Eingabe zu behandeln. Überprüfen Sie dies über MSTN .

    [Konsole] :: TreatControlCAsInput = $ true

Führen Sie dann eine UI-Schleife aus, um die Tasteneingabe zu überprüfen:

while ($true) {

  write-host "Processing..."
  if ([console]::KeyAvailable) {

    $key = [system.console]::readkey($true)
    if (($key.modifiers -band [consolemodifiers]"control") -and
      ($key.key -eq "C")) {

      :
      break
    }
  }
}
:
  1. Um den Job zu stoppen, wenn "Strg-C" gedrückt wird,

    stop-job -job $ killMe

Das Leben wird jedoch nicht einfach, wenn Sie mit Ihrem Python-Server interagieren müssen, der im Hintergrund ausgeführt wird. Und Sie möchten wahrscheinlich die Ausgabe Ihres Servers ständig anzeigen.

chingNotCHing
quelle