10

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

2 ответа2

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, который работает в фоновом режиме. И вы, вероятно, хотели бы постоянно отображать вывод вашего сервера.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .