2015-10-25 1 views
1

Следующий код записывается в файл morph.py:Возможно ли код самофиксации на Python?

with open("morph.py", "r+") as f: 
    old = f.read() # read everything in the file 
    f.seek(0,2) # rewind 
    f.write("1") # write the new line before 
a="BAD" 
a1="Worked" 
print a 

Идея заключается в том, что файл morph.py будет переписан, и текст «Работали» будет напечатано.

Это не тот случай, я думаю, что это связано с тем, как интерпретатор Python загружает файлы. Единственное, что имеет смысл, это то, что весь файл загружен, а затем запускается.

Может ли кто-нибудь пролить свет? Возможно ли даже иметь собственный морфинг-код в python?

Частично связанный с этим вопрос: Self decompressing and executing code in python

+2

'f.seek (-0,2)' - отрицательный ноль ??? – selbie

+0

Я проголосовал за закрытие простой типографской ошибки: ['os.SEEK_SET == 0'] (https://docs.python.org/3/library/os.html#os.lseek), а не' 2'. Просто используйте предопределенные константы вместо магического числа. (См. Также: ['imp.reload'] (https://docs.python.org/3/library/imp.html#imp.reload)) – kay

+0

Функция поиска выполняет то, что я ожидаю от нее. Если я запускаю код во второй раз, он выводит «Работал». Как Python запускает файлы? Загружает ли он весь файл в памяти? Это кажется немного бессмысленным, так как может быть множество операторов if, которые никогда не будут запущены. –

ответ

3

Не так, как вы пытаетесь это сделать.

Прежде чем Python начнет выполнение какой-либо части кода, он скомпилирует его в представление байт-кода, которое выполняется намного быстрее, чем чтение по очереди. Это означает, что после того, как Python скомпилировал файл, никакие изменения в файле не будут отображаться в текущем коде.

Однако вы можете вручную загрузить код из строк с помощью compile, exec или eval. Вы можете использовать это, чтобы создать программу, которая передала свой собственный исходный код, изменяет и возвращает его, и выполняет измененный исходный код.

1

Когда я запустить файл в первый раз, он выдает:

BAD 

Когда я запускаю его во второй раз, когда он выводит:

Worked 

Все последующие разы он выдаст сообщение об ошибке:

... name 'a11' is not defined 

Когда вы запустите python в файле, он загрузит файл, затем преобразует его в байт-код, затем exec ute байт-код. Файл уже прошел преобразование при изменении файла, поэтому вы не видите эффекта.

Смежные вопросы