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 相关文章推荐
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
Python玩转PDF的各种骚操作
May 06 Python
Django框架使用mysql视图操作示例
May 15 Python
解决pyqt5中QToolButton无法使用的问题
Jun 21 Python
python 中如何获取列表的索引
Jul 02 Python
python爬虫中多线程的使用详解
Sep 23 Python
Python3离线安装Requests模块问题
Oct 13 Python
Python局部变量与全局变量区别原理解析
Jul 14 Python
python基于win32api实现键盘输入
Dec 09 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
ip签名探针
2006/10/09 PHP
PHP函数strip_tags的一个bug浅析
2014/05/22 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
2019/11/23 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
js 覆盖和重载 函数
2009/09/25 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
10个实用的脚本代码工具
2010/05/04 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
用js实现in_array的方法
2013/11/05 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
基于Vue.js实现简单搜索框
2020/03/26 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
分享Angular http interceptors 拦截器使用(推荐)
2019/11/10 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
python获取代理IP的实例分享
2018/05/07 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
BNKR中国官网:带你感受澳洲领先潮流时尚
2018/08/21 全球购物
幼儿园课题实施方案
2014/05/14 职场文书
大学生工作自荐书
2014/06/16 职场文书
交通违章检讨书
2014/09/21 职场文书
2016年主题党日活动总结
2016/04/05 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS