Eu tenho um script python de longa execução que periodicamente gera dados para a saída padrão que invoquei com algo como:
python script.py > output.txt
Este script está em execução há um tempo e eu quero pará-lo com Ctrl+, Cmas não perder nada de sua saída. Infelizmente, quando implementei o script, esqueci de liberar o buffer após cada linha de saída com algo parecido com o sys.stdout.flush()
(a solução sugerida anteriormente para forçar a liberação da saída), portanto, chamar o Ctrl+ Cagora fará com que eu perca toda a minha saída.
Se estiver imaginando se há alguma maneira de interagir com um script python em execução (ou, mais geralmente, um processo em execução) para forçá-lo a liberar seu buffer de saída. Não estou perguntando como editar e executar novamente o script para que ele seja liberado corretamente - esta questão é especificamente sobre a interação com um processo em execução (e, no meu caso, não perder a saída da minha execução atual do código).
fileobject.c
) que 2.7 . Alguém precisa se aprofundar noio
módulo.Não há solução para o seu problema imediato. Se o seu script já foi iniciado, você não poderá alterar o modo de buffer após o fato. Esses são todos os buffers da memória e tudo isso é configurado quando o script é iniciado, os identificadores de arquivo são abertos, os pipes são criados etc.
Como um tiro no escuro, se e somente se parte ou todo o buffer em questão está sendo feito no nível de E / S na saída, você pode executar um
sync
comando; mas isso geralmente é improvável em um caso como esse.No futuro, você pode usar a
-u
opção * do Python para executar o script. Em geral, muitos comandos têm opções específicas de comando para desativar o buffer stdin / stdout, e você também pode ter algum sucesso genérico com ounbuffer
comando doexpect
pacote.O A Ctrl+ Cfaria com que os buffers no nível do sistema fossem liberados quando o programa for interrompido , a menos que o buffer seja feito pelo próprio Python e ele não tenha implementado a lógica para liberar seus próprios buffers com o Ctrl+ C. Suspender, travar ou matar não seria tão gentil.
* Force stdin, stdout e stderr a serem totalmente inalterados.
fonte
Documentação do Python 2.7.7, seção "Configuração e uso do Python", subseção 1. Linha de comando e ambiente , descreve este argumento do Python:
E também esta variável de ambiente:
fonte
sys.stdout.flush()
, mas sua-u
opção parece ainda mais fácil), mas acabei de esquecer de fazê-lo ao invocar meu código. Já tendo executado meu código por mais de uma semana, esperava que houvesse uma maneira de obter minha saída sem precisar executar novamente o código por mais uma semana.Parece que eu estava sendo muito cauteloso em perder a saída em buffer depois de executar o Ctrl-C; de acordo com este post , devo esperar que o buffer seja liberado se meu programa tiver uma saída normal, o que seria o caso se eu pressionar Ctrl-C. Por outro lado, eu perderia a saída em buffer se matasse o script com SIGKILL ou similar.
fonte
Penso que outra solução possível pode ser forçar a morte do processo com o núcleo despejado e depois analisar o conteúdo da memória postumamente.
fonte