PythonPython-的编译反编译
【Python】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版本信息,以及源代码内容。









