pyhton中__pycache__文件夹的产生与作用详解


Posted in Python onNovember 24, 2019

用python编写了一个工程,但在第一次运行后,发现工程根目录下生成了一个__pycache__文件夹,里面是和py文件同名的各种以.cpython-35.pyc结尾的文件。cpython-35各项意义,cpython代表的是c语言实现的Python解释器,-35代表的是3.5版本。至于pyc,需要先了解一下模块的调用。

模块的调用

Python导入模块时,实际上会把被导入的模块执行一遍。例如调用test.py模块:

def haha():
  print("haha")

haha()

主程序main.py:

import test

print("good")

执行结果:

haha
good

如何才能只是单纯调用而不执行被调用模块的代码呢?要想被调用模块代码不被执行,可以使用__name__。如果不涉及模块导入,__name__的值就是__main__,如果模块被导入引用的话,那么这个模块内的__name__值就是文件的名字(不带.py),例如test.py:

def haha():
  print("haha")

haha()
print(__name__)

执行结果为:

haha
__main__

如果test被导入引用的话,例如test2:

import test

print("good")

运行结果为:

haha
test
good

在被调用的模块中,可执行代码前加上if __name__ == '__main__':这么一句判断,被调用的模块的代码就不会被执行。

由来

Python程序运行时不需要编译成二进制代码,而直接从源码运行程序。简单来说是,Python解释器将源码转换为字节码,然后再由解释器来执行这些字节码。

解释器的具体工作:

1、完成模块的加载和链接;
2、将源代码编译为PyCodeObject对象(即字节码),写入内存中,供CPU读取;
3、从内存中读取并执行,结束后将PyCodeObject写回硬盘当中,也就是复制到.pyc或.pyo文件中,以保存当前目录下所有脚本的字节码文件。

之后若再次执行该脚本,它先检查【本地是否有上述字节码文件】和【该字节码文件的修改时间是否在其源文件之后】,是就直接执行,否则重复上述步骤。

第一次执行代码的时候,Python解释器已经把编译的字节码放在__pycache__文件夹中,这样以后再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去__pycache__文件夹中去运行相关的*.pyc文件,大大缩短了项目运行前的准备时间。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
从Python程序中访问Java类的简单示例
Apr 20 Python
用python写一个windows下的定时关机脚本(推荐)
Mar 21 Python
详谈python read readline readlines的区别
Sep 22 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
如何利用python 读取配置文件
Jan 06 Python
Python实现自动玩连连看的脚本分享
Apr 04 Python
使用Python实现画一个中国地图
Nov 23 #Python
用Python画小女孩放风筝的示例
Nov 23 #Python
python实现对列表中的元素进行倒序打印
Nov 23 #Python
Python实现打印实心和空心菱形
Nov 23 #Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 #Python
python实现画循环圆
Nov 23 #Python
解决python彩色螺旋线绘制引发的问题
Nov 23 #Python
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
thinkPHP的Html模板标签使用方法
2012/11/13 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
JS继承 笔记
2011/07/13 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
JavaScript跨域方法汇总
2014/10/16 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
对angular4子路由&辅助路由详解
2018/10/09 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
[42:36]DOTA2上海特级锦标赛B组败者赛 VG VS Spirit第二局
2016/02/26 DOTA
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
python模块restful使用方法实例
2013/12/10 Python
Python 3.x读写csv文件中数字的方法示例
2017/08/29 Python
Python subprocess模块功能与常见用法实例详解
2018/06/28 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
《我的第一本书》教学反思
2014/02/15 职场文书
初中差生评语
2014/12/29 职场文书
银行求职信模板
2015/03/20 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python