Mantendo o PowerShell aberto após CTRL-BREAK

10

Estou trabalhando com o Python Django no Windows Vista Powershell. Depois de executar python manage.py runserver, ele me pede CTRL-BREAKpara interromper o processo. Mas depois que eu digitei isso, o Powershell interrompe o processo e fecha. Existe uma maneira de parar o processo e manter o PowerShell aberto?

GTyler
fonte
Esse padrão do django-windows é terrível por várias razões (como o fato de muitos laptops e até o teclado virtual embutido não terem uma chave de interrupção). Eu gostaria de poder encontrar uma solução alternativa.
Mortoc 30/08/2013
O Python geralmente mente sobre o que fazer para sair / parar um processo. Mas você pode tentar outras CTRL- <opções>. Por exemplo: CTRL-C / Z / D
not2qubit 26/02
@ user1147688 ctrl + break mata instantaneamente o interpretador python no Windows, enquanto ctrl + c pode ser capturado ou ignorado.
Smit Johnth

Respostas:

3

Infelizmente, o host do console do PowerShell usa Ctrl+Cpara finalizar uma operação em andamento e Ctrl+Breakfinaliza a operação E fecha a sessão do host. É uma escolha muito infeliz, IMHO, mas está lá e podemos conviver com ela.

Acho que a coisa mais fácil de fazer quando me deparo com situações como esta é da sessão do PowerShell, basta executar cmdno prompt do PowerShell. Agora, estou ignorando o PowerShell temporariamente e volto facilmente à minha sessão do PowerShell quando terminar.

A outra coisa que você provavelmente deve considerar é usar o cmd.exe em vez do PowerShell, a menos que haja algum recurso do PowerShell que você esteja tentando aproveitar.

Greg Wojan
fonte
1

Você pode tentar desta maneira:

  1. Seu PowerShell lança seu programa Python em um trabalho

  2. Prenda Ctrl-C pelo processo principal do PowerShell

  3. Quando Ctrl-C estiver interceptado, pare o trabalho iniciado na etapa 1

Em seguida, você pode manter o script do PowerShell continuando

  1. Para iniciar um trabalho em segundo plano, use start-job

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

  2. Para interceptar o Ctrl-C, diga ao seu console para tratar o Ctrl-C como uma entrada, verifique isso no MSTN .

    [console] :: TreatControlCAsInput = $ true

Em seguida, execute um loop da interface do usuário para verificar a entrada de chaves:

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. Para interromper o trabalho quando pressionar "Ctrl-C",

    stop-job -job $ killMe

No entanto, a vida não será fácil se você precisar interagir com o servidor python, que está sendo executado em segundo plano. E você provavelmente gostaria de exibir a saída do seu servidor constantemente.

chingNotCHing
fonte