Python 的编译&反编译
Python 的编译&反编译
Python 的文件后缀
Python
常见的文件后缀有:py
、pyc
、pyc
、pyi
、pyw
、pyd
、pyx
等。
py
,Python
源代码文件,使用python xxx.py
即可执行源码文件。pyc
,Python
源代码编译生成的文件,由Python
的虚拟机执行,相对于.py
文件来说,.pyc
只是模块加载速度提高,并没有提高代码的执行速度,更多的意义在于避免源码的泄露。pyo
,优化后的Python
字节码缓存文件,pyo
文件和pyc
文件基本上没有区别,唯一的优化是去掉了断言语句,即assert
语句。pyi
,Python
的存根文件,用于代码检查时的类型提示。pyw
,Python
源文件的一种,一般只存在于Windows
系统。pyd
,Python
可直接调用的C
语言动态链接库文件,一般只存在于Windows
系统。pyx
,Cython
源代码文件,一般用来编写Python
的C
扩展。
Python 的编译和反编译
Python
的编译指的是将 py
文件编译为 pyc
文件,反编译则为该操作的逆向动作。
Python 源文件的编译
Python
的编译共有以下三种方式:
使用
python xxx.py
执行文件的过程中进行编译。首先准备一个简单的
python
文件hello.py
,内容如下:# hello.py print("hello world")
使用
python hello.py
,执行该文件并没有生成pyc
文件。再创建一个
import.py
的文件,内容如下:# import.py import hello
使用
python import.py
,执行该文件的时候,生成了pyc
文件,python3
执行代码,会在当前目录下创建__pycache__
目录下生成对应的pyc
文件。使用
python
可以直接执行该pyc
文件,与执行python import.py
的效果一致。使用
py_compile
第三方库编译源文件。执行该步骤之前,先删除上一步操作生成的
__pycache__
这个目录,这一步操作是执行Python
代码进行的编译操作,进行转化的代码参考如下内容,使用第三方库进行编译,无需考虑代码中是否包含import
语句,均能够正常编译,如下所示:import py_compile py_compile.compile('sample.py')
这里也可以使用
python -m
指定py_compile
第三方库对文件进行编译。使用
compileall
第三方库编译源文件。执行该步骤之前,先删除上一步操作生成的
__pycache__
这个目录,进行编译的操作与py_compile
基本类似,不同的是compileall
能够对文件进行迭代编译,进行编译操作的代码如下所示:import compileall compileall.compile_file('hello.py') # 可以递归编译文件夹下所有的python源代码文件 compileall.compile_dir('dir/', force=True)
执行完成如上代码后,在当前目录以及
dir
目录下生成对应的文件编译的pyc
文件,直接进行执行,如下所示:这里和
py_compile
一样,也能够直接指定文件进行编译,如下所示:python -m compileall .\hello.py python -m compileall .\dir\
Python 的反编译
编译能够在一定程度上实现隐藏源代码的效果,可以通过反编译 pyc
文件来获取 py
源代码,这里使用 uncompyle6
第三方库,具体的过程如下:
安装
uncompyle6
第三方库。pip install uncompyle6 -i https://pypi.tuna.tsinghua.edu.cn/simple
使用
uncompyle6
对pyc
文件进行反编译。uncompyle6 -o . *.pyc
打开生成的
py
源代码,内容如下,包含有Python
版本信息、uncompyle6
版本信息,以及源代码内容。