Сохранение PowerShell открытым после CTRL-BREAK

10

Я работаю с Python Django в Windows Vista Powershell. После того, как я бегу python manage.py runserver, он просит меня CTRL-BREAKостановить процесс. Но после того, как я напечатал это, Powershell останавливает процесс и закрывается. Есть ли способ остановить процесс и оставить Powershell открытым?

Concerned_Citizen
источник
Это django-windows по умолчанию ужасно по многим причинам (например, тот факт, что многие ноутбуки и даже встроенная виртуальная клавиатура не имеют клавиши прерывания). Я хотел бы найти обходной путь.
Mortoc
Python часто лжет о том, что нужно сделать, чтобы выйти / остановить процесс. Но вы можете попробовать другие CTRL- <опции>. Например: CTRL-C / Z / D
not2qubit
@ user1147688 ctrl + break мгновенно убивает интерпретатор python в windows, а ctrl + c может быть перехвачен или проигнорирован.
Смит Джонт

Ответы:

3

К сожалению, хост консоли PowerShell использует Ctrl+Cдля завершения текущей операции и Ctrl+Breakзавершения операции И закрывает сеанс хоста. Это самый неудачный выбор, ИМХО, но он есть, и мы должны с этим жить.

Я считаю, что самое простое, что можно сделать, когда я сталкиваюсь с подобными ситуациями, из сеанса PowerShell - просто выполнить cmdиз командной строки PowerShell. Теперь я фактически временно обхожу PowerShell и легко возвращаюсь к своему сеансу PowerShell после завершения.

Другая вещь, которую вы, вероятно, должны рассмотреть, это использовать cmd.exe, а не PowerShell, если только вы не пытаетесь использовать какую-то особенность PowerShell.

Грег Войан
источник
1

Вы можете попробовать это следующим образом:

  1. Ваш PowerShell запускает вашу программу Python в работе

  2. Ловушка Ctrl-C основным процессом powershell

  3. Когда Ctrl-C захвачен, остановите задание, запущенное на шаге 1

Затем вы можете продолжить выполнение сценария PowerShell.

  1. Чтобы запустить фоновое задание, используйте start-job

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

  2. Чтобы перехватить Ctrl-C, попросите консоль обрабатывать Ctrl-C как ввод, проверьте это из MSTN .

    [console] :: TreatControlCAsInput = $ true

Затем запустите цикл пользовательского интерфейса для проверки ввода ключей:

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. Чтобы остановить работу, когда нажата клавиша «Ctrl-C»,

    stop-job -job $ killMe

Однако жизнь не будет легкой, если вам нужно взаимодействовать с вашим сервером Python, который работает в фоновом режиме. И вы, вероятно, хотели бы постоянно отображать вывод вашего сервера.

chingNotCHing
источник