1 - Python编译过程涉及的文件

py
源代码文件,由python.exe解释,可在控制台下运行,可用文本编辑器进行编辑;
pyc
源代码文件经过编译后生成的二进制文件,无法用文本编辑器进行编辑;
执行一个.py文件后,并不会自动生成对应的.pyc文件,需要指定触发Python来创建pyc文件;

  • pyc是由py文件经过编译后生成的二进制字节码(byte code)文件;
  • pyc文件的加载速度比py文件快;
  • pyc文件是一种跨平台的字节码,由python的虚拟机来执行;
  • pyc文件的内容跟python版本相关,不同的python版本编译生成不同的pyc文件,只能在相同版本环境下执行;

pyo

源代码文件经过优化编译后生成的文件,无法用文本编辑器进行编辑;
Python3.5之后,不再使用.pyo文件名,而是使用类似“xxx.opt-n.pyc的文件名;

pyd

是python的动态链接库;
动态链接库(DLL)文件是一种可执行文件,允许程序共享执行特殊任务所必需的代码和其他资源;
pyd文件虽然是作为python的动态模块,但实质上还是DLL文件,只是后缀改为pyd;
一般是用C、C++、D语言按照一定的格式编写;
参考信息:https://docs.python.org/3/faq/windows.html?highlight=pyd#is-a-pyd-file-the-same-as-a-dll

pyz

从Python 3.5开始,定义了.pyz和.pyzw分别作为“Python Zip应用”和“Windows下Python Zip应用”的扩展名。
新增了内置zipapp模块来进行简单的管理,可以用Zip打包Python程序到一个可执行.pyz文件。

  • zipapp — Manage executable python zip archives
  • https://docs.python.org/3/library/zipapp.html
    详细内容请见PEP441(https://www.python.org/dev/peps/pep-0441/)

2 - 生成pyc文件

执行一个.py文件后,并不会自动生成对应的.pyc文件,需要指定触发Python来创建pyc文件。
可以利用Python的import机制创建pyc文件:

  • 内置的py_compile模块可以把py文件编译为pyc或pyo文件;
  • 内置的compileall模块可以把整个目录中的py文件编译为pyc或pyo文件;

生成pyc文件的过程:

Python在执行import语句时(例如“import abc”),将会到已设定的path中寻找abc.pyc或abc.dll文件。
如果只是发现了abc.py,那么Python会首先将abc.py编译成相应的PyCodeObject中间结果,然后创建abc.pyc文件,并将中间结果写入该文件。
然后,Python会import这个abc.pyc文件,实际上也就是将abc.pyc文件中的PyCodeObject重新在内存中复制出来。

生成pyc文件的方法:

命令形式:

python -m py_compile file.py  # 生成单个pyc文件
python -m py_compile /dir/{file1,file2}.py  # 生成多个pyc文件
python -m compileall /dir/  # 生成目录下所有py文件对应的pyc文件

脚本形式:compile模块的compile函数

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import py_compile  # 相当于命令行中的“-m py_compile”
py_compile.compile('py file path')

脚本形式:compileall模块的compile_dir函数

import compileall
compileall.compile_dir("py files dir")

生成pyc文件示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l
total 2
-rw-r--r-- 1 anliven 197121 50 37 22:55 sample.py
-rw-r--r-- 1 anliven 197121 49 37 23:40 sample2.pyanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ cat sample.py
# -*- coding: utf-8 -*-
print("Hello Python !")anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ cat sample2.py
# -*- coding: utf-8 -*-
print("Hello World !")anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ python -m compileall ./
Listing './'...
Compiling './sample.py'...
Compiling './sample2.py'...anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l
total 6
drwxr-xr-x 1 anliven 197121  0 37 23:42 __pycache__/
-rw-r--r-- 1 anliven 197121 50 37 22:55 sample.py
-rw-r--r-- 1 anliven 197121 49 37 23:40 sample2.pyanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l __pycache__/
total 2
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample.cpython-36.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample2.cpython-36.pyc

3 - 生成pyo文件

与生成pyc文件类似,但要额外使用-O和-OO选项来生成pyo文件。
但在Python3.5之后,不再使用.pyo文件名,而是生成文件名类似“xxx.opt-n.pyc的文件。

命令示例:

python -O -m py_compile file.py
python -O -m py_compile /dir/{file1,file2}.py
python -O -m compileall /dir/

示例:python3.6生成pyo文件

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ python -O -m compileall ./
Listing './'...
Compiling './sample.py'...
Compiling './sample2.py'...anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l __pycache__/
total 4
-rw-r--r-- 1 anliven 197121 122 37 23:42 sample.cpython-36.opt-1.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample.cpython-36.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:42 sample2.cpython-36.opt-1.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample2.cpython-36.pyc

示例:python2.7生成pyo文件

anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l
total 6
drwxr-xr-x 1 anliven 197121  0 37 23:42 __pycache__/
-rw-r--r-- 1 anliven 197121 50 37 22:55 sample.py
-rw-r--r-- 1 anliven 197121 49 37 23:40 sample2.pyanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ py -2 -O -m compileall ./
Listing ./ ...
Listing ./__pycache__ ...
Compiling ./sample.py ...
Compiling ./sample2.py ...anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l
total 8
drwxr-xr-x 1 anliven 197121   0 37 23:42 __pycache__/
-rw-r--r-- 1 anliven 197121  50 37 22:55 sample.py
-rw-r--r-- 1 anliven 197121 122 37 23:45 sample.pyo
-rw-r--r-- 1 anliven 197121  49 37 23:40 sample2.py
-rw-r--r-- 1 anliven 197121 122 37 23:45 sample2.pyo

4 - 运行pyc或pyo文件

运行pyc文件

anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ python sample.cpython-36.pyc
Hello Python !anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ python sample2.cpython-36.pyc
Hello World !anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ python sample.cpython-36.opt-1.pyc
Hello Python !anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ python sample2.cpython-36.opt-1.pyc
Hello World !

运行pyo文件

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l
total 8
drwxr-xr-x 1 anliven 197121   0 37 23:42 __pycache__/
-rw-r--r-- 1 anliven 197121  50 37 22:55 sample.py
-rw-r--r-- 1 anliven 197121 122 37 23:45 sample.pyo
-rw-r--r-- 1 anliven 197121  49 37 23:40 sample2.py
-rw-r--r-- 1 anliven 197121 122 37 23:45 sample2.pyoanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ py -2 sample.pyo
Hello Python !anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ py -2 sample2.pyo
Hello World !

5 - 利用uncompyle6进行Python反编译

uncompyle6

  • Python cross-version byte-code decompiler
  • PyPI:https://pypi.python.org/pypi/uncompyle6
  • GitHub:https://github.com/rocky/python-uncompyle6

安装uncompyle6

$ pip3 install --proxy="10.144.1.10:8080" uncompyle6
Collecting uncompyle6Downloading uncompyle6-3.0.0-py36-none-any.whl (195kB)100% |████████████████████████████████| 204kB 321kB/s
Requirement already satisfied: six in c:\python36\lib\site-packages (from uncompyle6)
Collecting spark-parser<1.9.0,>=1.8.5 (from uncompyle6)Downloading spark_parser-1.8.5-py36-none-any.whl
Collecting xdis<3.7.0,>=3.6.9 (from uncompyle6)Downloading xdis-3.6.11-py36-none-any.whl (74kB)100% |████████████████████████████████| 81kB 153kB/s
Collecting click (from spark-parser<1.9.0,>=1.8.5->uncompyle6)Using cached click-6.7-py2.py3-none-any.whl
Installing collected packages: click, spark-parser, xdis, uncompyle6
Successfully installed click-6.7 spark-parser-1.8.5 uncompyle6-3.0.0 xdis-3.6.11$ pip3 show uncompyle6
Name: uncompyle6
Version: 3.0.0
Summary: Python cross-version byte-code decompiler
Home-page: https://github.com/rocky/python-uncompyle6/
Author: Rocky Bernstein, Hartmut Goebel, John Aycock, and others
Author-email: rb@dustyfeet.com
License: MIT
Location: c:\python36\lib\site-packages
Requires: xdis, spark-parser, six

示例:反编译pyc文件

anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ ls -l
total 4
-rw-r--r-- 1 anliven 197121 122 37 23:42 sample.cpython-36.opt-1.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample.cpython-36.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:42 sample2.cpython-36.opt-1.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample2.cpython-36.pycanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ uncompyle6 sample.cpython-36.pyc > s1.pyanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ ls -l
total 5
-rw-r--r-- 1 anliven 197121 335 38 00:01 s1.py
-rw-r--r-- 1 anliven 197121 122 37 23:42 sample.cpython-36.opt-1.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample.cpython-36.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:42 sample2.cpython-36.opt-1.pyc
-rw-r--r-- 1 anliven 197121 122 37 23:41 sample2.cpython-36.pycanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$ cat s1.py
# uncompyle6 version 3.0.1
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)]
# Embedded file name: ./sample.py
# Compiled at: 2018-03-07 22:55:30
# Size of source mod 2**32: 50 bytes
print('Hello Python !')
# okay decompiling sample.cpython-36.pycanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test/__pycache__
$

示例:反编译pyo文件

anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ ls -l
total 8
drwxr-xr-x 1 anliven 197121   0 38 00:01 __pycache__/
-rw-r--r-- 1 anliven 197121  50 37 22:55 sample.py
-rw-r--r-- 1 anliven 197121 122 37 23:45 sample.pyo
-rw-r--r-- 1 anliven 197121  49 37 23:40 sample2.py
-rw-r--r-- 1 anliven 197121 122 37 23:45 sample2.pyo                                            anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$                                                                                                   anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ uncompyle6 sample2.pyo > s2.py                                                                    anliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$ cat s2.py
# uncompyle6 version 3.0.1
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)]
# Embedded file name: ./sample2.py
# Compiled at: 2018-03-07 23:40:22
print 'Hello World !'
# okay decompiling sample2.pyoanliven@DESKTOP-68OFQFP MINGW64 /d/Anliven/Anliven-Code/Test
$

uncompyle6的帮助信息

$ uncompyle6 --helpUsage:uncompyle6 [OPTIONS]... [ FILE | DIR]...uncompyle6 [--help | -h | --V | --version]Examples:uncompyle6      foo.pyc bar.pyc       # decompile foo.pyc, bar.pyc to stdoutuncompyle6 -o . foo.pyc bar.pyc       # decompile to ./foo.pyc_dis and ./bar.pyc_disuncompyle6 -o /tmp /usr/lib/python1.5 # decompile whole libraryOptions:-o <path>     output decompiled files to this path:if multiple input files are decompiled, the common prefixis stripped from these names and the remainder appended to<path>uncompyle6 -o /tmp bla/fasel.pyc bla/foo.pyc-> /tmp/fasel.pyc_dis, /tmp/foo.pyc_disuncompyle6 -o /tmp bla/fasel.pyc bar/foo.pyc-> /tmp/bla/fasel.pyc_dis, /tmp/bar/foo.pyc_disuncompyle6 -o /tmp /usr/lib/python1.5-> /tmp/smtplib.pyc_dis ... /tmp/lib-tk/FixTk.pyc_dis-c <file>     attempts a disassembly after compiling <file>-d            print timestamps-p <integer>  use <integer> number of processes-r            recurse directories looking for .pyc and .pyo files--fragments   use fragments deparser--verify      compare generated source with input byte-code--verify-run  compile generated source, run it and check exit code--weak-verify compile generated source--linemaps    generated line number correspondencies between byte-codeand generated source output--help        show this messageDebugging Options:--asm     -a  include byte-code         (disables --verify)--grammar -g  show matching grammar--tree    -t  include syntax tree       (disables --verify)Extensions of generated files:'.pyc_dis' '.pyo_dis'   successfully decompiled (and verified if --verify)+ '_unverified'       successfully decompile but --verify failed+ '_failed'           decompile failed (contact author for enhancement)

浅谈Python的编译与反编译相关推荐

  1. python源代码的后缀名是_Python代码编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  2. Python程序编译与反编译

    众所周知,Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议.那么很自然会有人有这样的疑问:难道Python程序只能以 ...

  3. 谈谈Python的编译和反编译

    用Python写脚本,小程序可谓非常方便,但它需要有特定的python环境才能运行,因此如果你想在别的电脑上运行时就会出现许多问题,就算已经安装了Python,但版本可能相差较大,且相关的依赖库没有安 ...

  4. python编译和反编译

    结论:从反编译的角度来看,想通过把.py 明文文件编译为.pyc二进制文件的方式,达到对python源码保密的目的是不可行的. 文章目录 1. 文件结构 2. 编译 3. 反编译 4. 总结 1. 文 ...

  5. python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  6. 浅谈 Python 程序和 C 程序的整合

    浅谈 Python 程序和 C 程序的整合 Python 是一种用于快速开发软件的编程语言,它的语法比较简单,易于掌握,但存在执行速度慢的问题,并且在处理某些问题时存在不足,如对计算机硬件系统的访问, ...

  7. python语言源程序文件类型_浅谈Python的文件类型

    Python的文件类型主要分为3种:源代码(source file).字节码(byte-code file).优化的字节码(optimized file).这些代码都可以直接运行,不需要编译或者连接. ...

  8. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题

    前言 Python文件默认的编码格式是ascii ,无法识别汉字,因为ascii码中没有中文. 所以py文件中要写中文字符时,一般在开头加 # -*- coding: utf-8 -*- 或者 #co ...

  9. python open找不到文件的原因_浅谈python在提示符下使用open打开文件失败的原因及解决方法...

    题目:在提示符下使用open打开一个文件 刚开始网上看了下打开的方式,结果一直实现不了,报错是没找到这个文件,而且和我输入的文件名不一样. 错误如下: >>>open('d:\456 ...

  10. Java——编译与反编译

    ** 一.基础知识 ** 1.1 编程语言 在介绍编译和反编译之前,我们先来简单介绍下编程语言(Programming Language).编程语言(Programming Language)分为低级 ...

最新文章

  1. data-参数说明(模态弹出窗的使用)
  2. PHP isset()与empty()的使用区别详解
  3. Android 请求PHP接口, 返回json, 开头有问号, 解决方案
  4. 【SDCC 2016·杭州站】9月22日大数据实战专场精彩呈现
  5. 工程代码_特征工程学习,19 项实践 Tips!代码已开源!
  6. [NOIP2015提高组]运输计划
  7. 实验6 数据查询--高级查询
  8. Mongo数据库安装成Windows服务
  9. [Node.js] mySQL数据库 -- 英雄英雄管理系统接口
  10. Java基础通信_Java网络通信基础编程(必看篇)
  11. android原生插件,适用于 Android 的原生 (C++) 插件
  12. Mac电脑如何调整鼠标灵敏度
  13. 在IDEA中玩转DEBUG模式,有BUG不会调试?不存在的。
  14. php中dump是什么文件怎么打开,Win8/Win10 dump文件怎么打开?dump文件分析工具下载及使用教程...
  15. 常用EXE文件反编译工具
  16. SWF播放器object DEMO
  17. 70.(cesium之家)cesium接入天地图影像与注记(经纬度)
  18. Python的特点(优点和缺点)
  19. html文件打开自动跳转至空白
  20. Linux Qt cannot find -lGL

热门文章

  1. linux touch 学习
  2. 《大话设计模式》学习心得系列(一)
  3. NoMasp博客导读
  4. 下一步工作,尽量将代码整理归拢成可以随意组合拆装的代码块。
  5. 艾伟_转载:使用LINQ to SQL更新数据库(上):问题重重
  6. Asp.net 2.0 中获取控件输出的Html代码 (转)
  7. 高清电影如何加载字幕【解决】
  8. SAP中用json数据格式调用http接口发送短信邮件案例
  9. 13、Power Query-逆透视列的实例(下)
  10. 一个现金流量表的代码