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 相关文章推荐
Python3基础之基本数据类型概述
Aug 13 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 Python
python内存管理分析
Apr 08 Python
Python中最常用的操作列表的几种方法归纳
Apr 24 Python
利用Python实现图书超期提醒
Aug 02 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
Django框架封装外部函数示例
May 28 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
python实现修改固定模式的字符串内容操作示例
Dec 30 Python
keras 权重保存和权重载入方式
May 21 Python
Python用requests库爬取返回为空的解决办法
Feb 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+mysql来做一个功能强大的在线计算器
2010/10/12 PHP
基于php设计模式中单例模式的应用分析
2013/05/15 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
Javascript !!的作用
2008/12/04 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
2017/01/14 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
python实现自动更换ip的方法
2015/05/05 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
如何利用python生成MD5并去重
2020/12/07 Python
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
法国在线药房:DoctiPharma
2020/10/21 全球购物
企业申诉管理制度
2014/01/30 职场文书
中药专业自荐信范文
2014/03/18 职场文书
领导干部保密承诺书
2014/08/30 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
考研英语复习计划
2015/01/19 职场文书
银行稽核岗位职责
2015/04/13 职场文书