O que acontecerá se eu modificar um script Python enquanto estiver em execução?

219

Imagine um script python que levará muito tempo para ser executado. O que acontecerá se eu o modificar enquanto estiver em execução? O resultado será diferente?

wong2
fonte
8
O programa é carregado na sua memória principal. Se você alterar o arquivo de origem, nada acontece. Imagine a CPU iria ler as instruções do disco rígido ...
Felix Kling
15
@ Felix: Isso é chamado de "Execute-in-Place" (XIP).
Ignacio Vazquez-Abrams
@ Ignacio: Interessante, eu não sabia disso. Obrigado :)
Felix Kling
3
Você pode dinamicamente recarregar o código dos módulos, ver stackoverflow.com/questions/437589/...
Iliyan Bobev
2
Observe que os arquivos em lote do Windows são executados no local, portanto, essa não é uma pergunta hipotética; existem idiomas por aí que se comportam dessa maneira.
yoyo

Respostas:

259

Nada, porque o Python pré-compila seu script em um arquivo PYC e o lança.

No entanto, se ocorrer algum tipo de exceção, você poderá obter uma explicação um pouco enganosa, porque a linha X pode ter um código diferente do que antes de iniciar o script.

Lixas
fonte
10
Não necessariamente em um arquivo.
Ignacio Vazquez-Abrams
60
Mas e se você reiniciar enquanto estiver executando, quando os novos arquivos pyc sobrescreverem os antigos, isso causará problemas no programa que já estava sendo executado ou não?
Deceleratedcaviar
26
Nada acontece. Eu também verifiquei em um pequeno teste. O que acontece: o pyc é apenas o compilado. E esse compilado é carregado na RAM e depois executado. Portanto, sempre é possível alterar o programa, recompilar e executar outra instância, por exemplo, em um console diferente.
Chris
7
@ Chris Comecei uma instância do meu script python em um console. Enquanto isso estava em execução, alterei duas linhas de código e iniciei outra instância em um console separado. Depois de algum tempo, recebi um erro retornado do primeiro console sobre as duas linhas de código que eu alterei após iniciá-lo! pls ajuda
double_j
14
@ Chris Acho que sei o que acontece aqui. Se você modificar um script e salvar enquanto estiver em execução, e os erros da versão anterior, na leitura do traceback, ele abrirá a versão atual do arquivo e fará com que o traceback pareça diferente do que quando você iniciou. Eu já vi isso em várias ocasiões.
double_j