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的Django框架下使用django-tagging的教程
May 30 Python
基于Python实现文件大小输出
Jan 11 Python
Python的re模块正则表达式操作
May 25 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
详解python3中zipfile模块用法
Jun 18 Python
python实现两张图片的像素融合
Feb 23 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
python中remove函数的踩坑记录
Jan 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
PHP中的函数嵌套层数限制分析
2011/06/13 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
分享一个漂亮的php验证码类
2016/09/29 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
Javascript 中的类和闭包
2010/01/08 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
js关于精确计算和数值格式化以及直接引js文件
2014/01/28 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
2020/05/23 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Python SQLite3数据库操作类分享
2014/06/10 Python
如何利用python查找电脑文件
2018/04/27 Python
python实现机器学习之多元线性回归
2018/09/06 Python
TensorFlow实现模型评估
2018/09/07 Python
Python3之不使用第三方变量,实现交换两个变量的值
2019/06/26 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
python3.7.3版本和django2.2.3版本是否可以兼容
2020/09/01 Python
python复合条件下的字典排序
2020/12/18 Python
英国时尚高尔夫服装购物网站:Trendy Golf
2020/01/10 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
医科大学生毕业的自我评价分享
2013/11/12 职场文书
面试后的感谢信范文
2014/02/01 职场文书
个人现实表现材料
2014/02/04 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
2014年底个人工作总结
2015/03/10 职场文书
网络妈妈观后感
2015/06/08 职场文书
环保建议书作文400字
2015/09/14 职场文书
队名及霸气口号大全
2015/12/25 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
Python+Tkinter打造签名设计工具
2022/04/01 Python