Что произойдет, если я изменю скрипт Python во время его работы?

220

Представьте себе скрипт на python, который займет много времени, что произойдет, если я изменю его во время работы? Будет ли результат отличаться?

wong2
источник
9
Программа загружается в вашу основную память. Если вы измените исходный файл, ничего не произойдет. Представьте, что процессор будет читать инструкции с жесткого диска ...
Феликс Клинг,
15
@Felix: это называется «Выполнить на месте» (XIP).
Игнасио Васкес-Абрамс
@Ignacio: Интересно, я этого не знал. Спасибо :)
Феликс Клинг
3
Вы можете динамически перезагружать код модулей, см. Stackoverflow.com/questions/437589/…
Илиян Бобев,
2
Обратите внимание , что пакетные файлы Windows , действительно выполнять на месте, так что это не гипотетический вопрос, есть языки, которые там ведут себя таким образом.
yoyo

Ответы:

260

Ничего, потому что Python предварительно компилирует ваш скрипт в PYC-файл и запускает его.

Однако, если возникает какое-то исключение, вы можете получить немного вводящее в заблуждение объяснение, потому что строка X может иметь другой код, чем до запуска сценария.

Lixas
источник
10
Не обязательно в файл.
Игнасио Васкес-Абрамс
60
Но что, если вы перезапустите во время работы, когда новые файлы pyc перезапишут старые, это вызовет проблемы в программе, которая уже была запущена или нет?
замедленная
26
Ничего не произошло. Я также проверил это в небольшом тесте. Что происходит: Pyc является только компилятором. И этот компилятор загружается в ОЗУ и затем выполняется. Поэтому всегда можно изменить программу, перекомпилировать и запустить другой экземпляр, например, в другой консоли.
Крис
7
@Chris Я запустил экземпляр моего скрипта Python в одной консоли. Пока он работал, я изменил две строки кода и запустил другой экземпляр в отдельной консоли. Через некоторое время из первой консоли вернулась ошибка о двух строках кода, которые я изменил после запуска! Просьба помочь
double_j
14
@ Крис, я думаю, я знаю, что здесь происходит. Если вы изменяете сценарий и сохраняете его во время его работы, а ошибки предыдущей версии при считывании трассировки открывают текущую версию файла и заставляют трассировку выглядеть иначе, чем при запуске. Я видел это сам несколько раз.
double_j