Um colega e eu estávamos revisando algumas propostas de alunos. Ele gosta de usar o IDLE, enquanto eu uso o PyCharm. O aluno desenvolveu seu código no PyCharm. Um exemplo simplificado do trabalho do aluno é:
file = open('test_file.txt','w')
file.write('This is a test file.')
print('Completed')
exit()
O aluno cometeu um erro no tratamento do arquivo e criou uma situação em que o arquivo ficou aberto após a conclusão do código.
Quando executado no PyCharm, o comando file.write é concluído e o arquivo é atualizado conforme o esperado. Quando executado no IDLE, o comando file.write parece não ter sido concluído e o arquivo está vazio. Quando executado na linha de comando (aliás, todos nós usamos Macbooks), o comando file.write é concluído e o arquivo contém a linha de texto. Outra dica é que, ao ser executado no IDLE, após a mensagem "Concluído" ser exibida, aparece uma caixa de diálogo do sistema que diz: "Seu programa ainda está em execução! Deseja encerrá-lo?". Este aviso não aparece quando executado na linha de comando ou no PyCharm.
Estamos tentando entender a diferença entre esses comportamentos, pois acreditamos que todos eles realizam o mesmo processo de invocar o mesmo intérprete.
O IDLE deixa o interpretador em execução após executar o código. Você pode retornar ao Shell e inspecionar variáveis, por exemplo. Se você sair do modo idle ou reiniciar o shell (Ctrl-F6), o interpretador sai (ou reinicia) e o arquivo será descarregado e fechado. Sem reiniciar o shell, o arquivo ainda estará aberto e as gravações em cache podem não ter sido gravadas no disco ainda.
Os outros IDEs parecem sair do interpretador quando o script é concluído. É uma decisão de design dos desenvolvedores.
Você obteria um resultado semelhante na linha de comando executando
python -i script.py
, o que deixa o interpretador em execução após executarscript.py
. O arquivo não será descarregado até a saída.Para sua informação: isso
exit()
está causando a mensagem de sistema IDLE. Ele encerra o interpretador e fecha o Shell, mas como é umakill
saída e não uma saída limpa, o arquivo não é liberado.