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编写vim插件的简单示例
Apr 17 Python
pygame实现弹力球及其变速效果
Jul 03 Python
Python实现学校管理系统
Jan 11 Python
Python线程创建和终止实例代码
Jan 20 Python
深入浅析Python中的yield关键字
Jan 24 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
彻底搞懂 python 中文乱码问题(深入分析)
Feb 28 Python
python 5个实用的技巧
Sep 27 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
Zend的AutoLoad机制介绍
2012/09/27 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
Laravel框架实现的rbac权限管理操作示例
2019/01/16 PHP
发现的以前不知道的函数
2006/09/19 Javascript
jquery实现心算练习代码
2010/12/06 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python的即时标记项目练习笔记
2014/09/18 Python
Python调用命令行进度条的方法
2015/05/05 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
简单了解Python生成器是什么
2019/07/02 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
升学宴主持词
2014/04/02 职场文书
低碳环保倡议书
2014/04/14 职场文书
教师节座谈会主持词
2015/07/03 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
python实现自定义日志的具体方法
2021/05/28 Python
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python