Python中的Self Morphing代码是否可能?

时间:2015-10-25 19:02:59

标签: python metaprogramming

以下代码写在morph.py文件中:

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 个答案:

答案 0 :(得分:3)

不是你想要这样做的方式。

在Python开始执行任何代码之前,它会将其编译为字节码表示,执行速度比逐行读取要快得多。这意味着在Python编译完文件后,文件的任何更改都不会反映在当前正在运行的代码中。

但是,您可以使用compileexeceval手动加载字符串中的代码。您可以使用它来创建一个程序,该程序传递自己的源代码,更改并返回它,并执行修改后的源代码。

答案 1 :(得分:1)

第一次输出时运行文件:

BAD

当我第二次运行它时输出:

Worked

以后任何时候都会出错:

... name 'a11' is not defined

当你在文件上运行python时,它会加载文件,然后将其转换为字节码,然后执行字节码。当您更改文件时,该文件已经过转换,因此您看不到任何效果。