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多线程ctrl+c退出问题解决方案
Oct 23 Python
Python使用Flask框架同时上传多个文件的方法
Mar 21 Python
python概率计算器实例分析
Mar 25 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
在Python的列表中利用remove()方法删除元素的教程
May 21 Python
Python OpenCV获取视频的方法
Feb 28 Python
对numpy中轴与维度的理解
Apr 18 Python
Python读取系统文件夹内所有文件并统计数量的方法
Oct 23 Python
在matplotlib的图中设置中文标签的方法
Dec 13 Python
重写django的model下的objects模型管理器方式
May 15 Python
python如何爬取网页中的文字
Jul 28 Python
通过实例解析Python文件操作实现步骤
Sep 21 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
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php自动加载的两种实现方法
2010/06/21 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
PHP使用函数用法详解
2018/09/30 PHP
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
jQuery选择器之子元素选择器详解
2017/09/18 jQuery
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
Vue实现一个图片懒加载插件
2019/03/11 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python实现顺序表的简单代码
2018/09/28 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Python中super函数用法实例分析
2019/03/18 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
python实现画图工具
2020/08/27 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
大学生两会学习心得体会
2014/03/10 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
python - asyncio异步编程
2021/04/06 Python
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android