Python是一个解释型的语言。但是为了效率上的考虑,Python也提供了编译的方法。编译之后是bytecode的形式。Python也提供了和Java类似的VM来执行这样的bytecode。不同的是,因为Python是一个解释型的语言,所以编译(compile)不是一个强制的操作。事实上,编译是一个自动的过程。多数情况下,你甚至不会在意他的存在。编译成bytecode可以节省加载模块的时间,从而提高效率
通常,自动的编译过程发生在对模块(module)的调用过程中。我们在查看python提供的标准类库的时候可以看到很多的.pyc文件,用file命令查看一下,发现类型是“data”,也就是二进制文件。我们做个实验,写个自己的module,然后看看他是如何编译的。关于模块的知识我们这里先不深入,以后有机会再谈。
OK,我们先写个自己的模块。文件名就叫做testM.py
#! /usr/bin/py thon
"""testM.py"""
class MyClass:
i = 1.2
def f(self):
return 'hello'
def __init__(self):
self.a = 'A'
if __name__ == '__main__':
x = MyClass
print x.i
其实模块(module)这个词没有什么神秘的。随便一个python文件,只要你愿意把他共享出来,它就是一个模块。
我们再写一个测试用的代码,testU.py
#! /usr/bin/python
import test
x = test.MyClass()
x.j = 123
print x.a
y = test.MyClass()
y.a = 'Y'
print y.a
print x.a
print x.j
我们可以看到模块名就是模块所在的文件名。现在我们执行一下testU.py。然后再查看一下当前目录。Aha!一个新文件:testM.pyc出现了。是一个二进制的文件。自动编译发生了。每次当我们更新了.py文件之后,.pyc文件也会对应的更新。
除了效率原因,bytecode也增加了反向工程的难度,在某种程度上保护你的代码。当然,反编译仍然是可以的。所以如果真的想保护代码,还是用别的方法吧。
另外Python还提供了-O选项,可以编译生成“优化”的bytecode,文件扩展名是.pyo。但实际上优化的内容有限,作用不大。
如果希望生成可执行文件,就要依赖于第三方的工具了。
sleetdrop 回复于:2005-06-08 13:57:37
为啥是python 7
阿
现在最高的版本才是2.4啊。
wolfg 回复于:2005-06-08 15:40:20
引用:原帖由 "sleetdrop" 发表: 为啥是python 7
阿
现在最高的版本才是2.4啊。
这个是sakulagi系列文章的第7篇,不是Python的版本,呵呵
xichen 回复于:2005-06-08 20:48:39
.pyc是中间代码,类似java和.net的中间代码.
可以让python的虚拟机装载中间代码运行,py2exe的工作原理与此类似.
你可以将用py2exe生成的zip文件打开,可以看到里面有pyc文件.
|