Utrzymywanie programu PowerShell otwartego po CTRL-BREAK

10

Pracuję z Python Django w Windows Vista Powershell. Po uruchomieniu python manage.py runserverprosi mnie CTRL-BREAKo zatrzymanie procesu. Ale po tym, jak to napisałem, Powershell zatrzymuje proces i zamyka. Czy istnieje sposób na zatrzymanie procesu i utrzymanie otwartej Powershell?

Zaniepokojony obywatel
źródło
To domyślne ustawienie django-windowsa jest straszne z wielu powodów (takich jak fakt, że wiele laptopów, a nawet wbudowana wirtualna klawiatura nie mają klawisza podziału). Chciałbym znaleźć rozwiązanie.
Mortoc
Python często kłamie na temat tego, co zrobić, aby wyjść / zatrzymać proces. Ale możesz wypróbować inne CTRL- <opcje>. Na przykład: CTRL-C / Z / D
not2qubit
@ user1147688 ctrl + break natychmiast zabija interpreter Pythona w systemie Windows, podczas gdy ctrl + c można złapać lub zignorować.
Smit Johnth

Odpowiedzi:

3

Niestety host konsoli PowerShell używa Ctrl+Cdo zakończenia trwającej operacji i Ctrl+Breakkończy operację ORAZ zamyka sesję hosta. To najbardziej niefortunny wybór IMHO, ale jest i możemy z tym żyć.

Uważam, że najłatwiejszą rzeczą do zrobienia, gdy napotykam takie sytuacje, jest sesja PowerShell, po prostu uruchom ją cmdz wiersza polecenia PowerShell. Teraz faktycznie omijam tymczasowo PowerShell i po zakończeniu łatwo wracam do sesji PowerShell.

Inną rzeczą, którą powinieneś prawdopodobnie rozważyć, jest użycie cmd.exe zamiast PowerShell, chyba że próbujesz wykorzystać jakąś funkcję PowerShell.

Greg Wojan
źródło
1

Możesz spróbować w ten sposób:

  1. Twój PowerShell uruchamia program Python w zadaniu

  2. Trap Ctrl-C przez główny proces PowerShell

  3. Gdy Ctrl-C jest uwięziony, zatrzymaj zadanie uruchomione w kroku 1

Następnie możesz kontynuować działanie skryptu PowerShell

  1. Aby uruchomić zadanie w tle, użyj polecenia start-job

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

  2. Aby przechwycić Ctrl-C, powiedz konsoli, aby traktowała Ctrl-C jako dane wejściowe, sprawdź to w MSTN .

    [konsola] :: TreatControlCAsInput = $ true

Następnie uruchom pętlę interfejsu użytkownika do sprawdzania danych wejściowych kluczy:

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. Aby zatrzymać zadanie po naciśnięciu klawisza „Ctrl-C”,

    stop-job -job $ killMe

Jednak życie nie będzie łatwe, jeśli zajdzie potrzeba interakcji z serwerem python, który działa w tle. Prawdopodobnie chcesz stale wyświetlać dane wyjściowe serwera.

chingNotCHing
źródło