对Python3 pyc 文件的使用详解


Posted in Python onFebruary 16, 2019

什么是pyc文件

pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的python是无法执行的。

为什么需要pyc文件

这个需求太明显了,因为py文件是可以直接看到源码的,如果你是开发商业软件的话,不可能把源码也泄漏出去吧?所以就需要编译为pyc后,再发布出去。当然,pyc文件也是可以反编译的,不同版本编译后的pyc文件是不同的,根据python源码中提供的opcode,可以根据pyc文件反编译出py文件源码,网上可以找到一个反编译python2.3版本的pyc文件的工具,不过该工具从python2.4开始就要收费了,如果需要反编译出新版本的pyc文件的话,就需要自己动手了(俺暂时还没这能力^--^),不过你可以自己修改python的源代码中的opcode文件,重新编译python,从而防止不法分子的破解。

生成pyc

一、引入模块、包生成

如果模块或包被其他的模块引入后,执行引入模块就会生成pyc文件(被动生成,如果是python2,会在本级目录生,如果是python3的话就在本级目录新建一个__pycache__文件,然后在__pycache__中生成pyc文件)

二、代码编译生成

1. 单个文件

python就是个好东西,它提供了内置的类库来实现把py文件编译为pyc文件,这个模块就是 py_compile 模块。

使用方法非常简单,如下所示,直接在idle中,就可以把一个py文件编译为pyc文件了。

>>> import py_compile
>>> py_compile.compile(r'/Users/zhangyi/Downloads/md5.py')
'/Users/zhangyi/Downloads/__pycache__/md5.cpython-37.pyc'
>>> 
 
Geek-Mac:__pycache__ zhangyi$ ls
md5.cpython-37.pyc

compile函数原型:

compile(file[, cfile[, dfile[, doraise]]])

file 表示需要编译的py文件的路径

cfile 表示编译后的pyc文件名称和路径,默认为直接在file文件名后加c 或者 o,o表示优化的字节码

dfile 这个参数英文看不明白,请各位大大赐教。(鄙视下自己)原文:it is used as the name of the source file in error messages instead of file

doraise 可以是两个值,True或者False,如果为True,则会引发一个PyCompileError,否则如果编译文件出错,则会有一个错误,默认显示在sys.stderr中,而不会引发异常

2. 多个文件

一般来说,我们的工程都是在一个目录下的,一般不会说仅仅编译一个py文件而已,而是需要把整个文件夹下的py文件都编译为pyc文件,python又为了我们提供了另一个模块:compileall 。使用方法如下:

>>> import compileall
>>> compileall.compile_dir(r'/Users/zhangyi/Downloads/MainText')
Listing '/Users/zhangyi/Downloads/MainText'...
Listing '/Users/zhangyi/Downloads/MainText/.idea'...
Listing '/Users/zhangyi/Downloads/MainText/.idea/inspectionProfiles'...
Compiling '/Users/zhangyi/Downloads/MainText/Api.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Block.py'...
Compiling '/Users/zhangyi/Downloads/MainText/JieBa.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Login.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Lxml.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Mat.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Myre.py'...
Compiling '/Users/zhangyi/Downloads/MainText/NLP.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Post.py'...
Compiling '/Users/zhangyi/Downloads/MainText/Text.py'...
Compiling '/Users/zhangyi/Downloads/MainText/get_project_url.py'...
Compiling '/Users/zhangyi/Downloads/MainText/headless_chrome_Test1.py'...
Compiling '/Users/zhangyi/Downloads/MainText/headless_chrome_Test2.py'...
Compiling '/Users/zhangyi/Downloads/MainText/learning.py'...
Compiling '/Users/zhangyi/Downloads/MainText/nsfc.py'...
Compiling '/Users/zhangyi/Downloads/MainText/re.py'...
Compiling '/Users/zhangyi/Downloads/MainText/spider_image.py'...
Compiling '/Users/zhangyi/Downloads/MainText/unit.py'...
True
>>> 
 
Geek-Mac:__pycache__ zhangyi$ pwd
/Users/zhangyi/Downloads/MainText/__pycache__
Geek-Mac:__pycache__ zhangyi$ ls
Api.cpython-37.pyc			Text.cpython-37.pyc
Block.cpython-37.pyc			get_project_url.cpython-37.pyc
JieBa.cpython-37.pyc			headless_chrome_Test1.cpython-37.pyc
Login.cpython-37.pyc			headless_chrome_Test2.cpython-37.pyc
Lxml.cpython-37.pyc			learning.cpython-37.pyc
Mat.cpython-37.pyc			nsfc.cpython-37.pyc
Myre.cpython-37.pyc			re.cpython-37.pyc
NLP.cpython-37.pyc			spider_image.cpython-37.pyc
Post.cpython-37.pyc			unit.cpython-37.pyc
Geek-Mac:__pycache__ zhangyi$

这样就把MainText目录,以及其子目录下的py文件编译为pyc文件了。嘿嘿,够方便吧。来看下compile_dir函数的说明:

compile_dir(dir[, maxlevels[, ddir[, force[, rx[, quiet]]]]])

dir 表示需要编译的文件夹位置

maxlevels 表示需要递归编译的子目录的层数,默认是10层,即默认会把10层子目录中的py文件编译为pyc

ddir 英文没明白,原文:it is used as the base path from which the filenames used in error messages will be generated。

force 如果为True,则会强制编译为pyc,即使现在的pyc文件是最新的,还会强制编译一次,pyc文件中包含有时间戳,python编译器会根据时间来决定,是否需要重新生成一次pyc文件

rx 表示一个正则表达式,比如可以排除掉不想要的目录,或者只有符合条件的目录才进行编译

quiet 如果为True,则编译后,不会在标准输出中,打印出信息

三、通过 Python Shell 命令生成

直接通过命令来运行,可以看到下面的命令中并没有用到compile()函数, 这是因为py_compile模块的main()函数中调用了compile().

python3 -m py_compile md5.py

python3 -O -m py_compile md5.py

-O 优化成字节码

-m 表示把后面的模块当成脚本运行

-OO 表示优化的同时删除文档字符串

如果你想看compile(), compile_dir(), compile_path()具体每个参数是干吗用的,可以使用print py_compile.compile().__doc__来查看,或者直接打开py_compile.py,compileall.py文件来看。

运行pyc文件

直接运行即可!

Geek-Mac:__pycache__ zhangyi$ python3 md5.pyc 
tokenKey ==> 696f6d1af498db3c54ffa572a2723cb7
timeStamp ==> 1530954550
find ==> 100
Geek-Mac:__pycache__ zhangyi$

总结

通过上面的方法,可以方便的把py文件编译为pyc文件了,从而可以实现部分的源码隐藏,保证了python做商业化软件时,保证了部分的安全性吧,继续学习下,看怎么修改opcode。

以上这篇对Python3 pyc 文件的使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
python使用cPickle模块序列化实例
Sep 25 Python
在Python操作时间和日期之asctime()方法的使用
May 22 Python
单利模式及python实现方式详解
Mar 20 Python
Python3连接SQLServer、Oracle、MySql的方法
Jun 28 Python
Python制作词云图代码实例
Sep 09 Python
python中p-value的实现方式
Dec 16 Python
PyTorch中反卷积的用法详解
Dec 30 Python
python使用SQLAlchemy操作MySQL
Jan 02 Python
python next()和iter()函数原理解析
Feb 07 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
Python父目录、子目录的相互调用方法
Feb 16 #Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 #Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 #Python
Python3 导入上级目录中的模块实例
Feb 16 #Python
对Python3 goto 语句的使用方法详解
Feb 16 #Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
Feb 16 #Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 #Python
You might like
PHP中soap的用法实例
2014/10/24 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JavaScript中定义类的方式详解
2016/01/07 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
vue watch关于对象内的属性监听
2019/04/22 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
Python内建数据结构详解
2016/02/03 Python
利用python为运维人员写一个监控脚本
2018/03/25 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
python实现KNN分类算法
2019/10/16 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
比利时香水网上商店:NOTINO
2018/03/28 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
销售目标责任书
2014/07/23 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
质量主管工作职责
2014/09/26 职场文书
思想政治表现评语
2015/01/04 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
2016年政治理论学习心得体会
2016/01/25 职场文书