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中处理时间之clock()方法的使用
May 22 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
pandas多级分组实现排序的方法
Apr 20 Python
Python 读写文件的操作代码
Sep 20 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
使用python3实现操作串口详解
Jan 01 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
django 单表操作实例详解
Jul 30 Python
python创建n行m列数组示例
Dec 02 Python
Python如何将将模块分割成多个文件
Aug 04 Python
Python实现七个基本算法的实例代码
Oct 08 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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/02/08 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
php微信公众平台示例代码分析(二)
2016/12/06 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
2017/04/27 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php实现数字补零的方法总结
2018/09/12 PHP
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
jquery根据name属性查找的小例子
2013/11/21 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
Python中property属性实例解析
2018/02/10 Python
Python多进程入门、分布式进程数据共享实例详解
2019/06/03 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
python爬虫要用到的库总结
2020/07/28 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
产品质量承诺范本
2014/03/31 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
企业党建工作总结2015
2015/05/26 职场文书
小学班主任研修日志
2015/11/13 职场文书
电工实训心得体会
2016/01/14 职场文书