对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使用urllib2模块获取gravatar头像实例
Dec 18 Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
python机器学习库常用汇总
Nov 15 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
Pytorch 中的optimizer使用说明
Mar 03 Python
tensorflow学习笔记之tfrecord文件的生成与读取
Mar 31 Python
Python数据可视化之Seaborn的安装及使用
Apr 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
JavaScript对象创建及继承原理实例解剖
2013/02/28 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
jquery实现tr元素的上下移动示例代码
2013/12/20 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
JS实现的文件拖拽上传功能示例
2018/05/21 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
怎么理解wx.navigateTo的events参数使用详情
2020/05/18 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
python 自动提交和抓取网页
2009/07/13 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
毕业生教师求职信
2013/10/20 职场文书
安全标语口号
2014/06/09 职场文书
四风问题查摆材料
2014/08/25 职场文书
三八妇女节寄语
2015/02/27 职场文书
论文致谢词范文
2015/05/14 职场文书
培养联系人考察意见
2015/06/01 职场文书
浅谈PHP7中的一些小技巧
2021/05/29 PHP
vue+echarts实现多条折线图
2022/03/21 Vue.js