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基础教程之对象和类的实际运用
Aug 29 Python
python中ConfigParse模块的用法
Sep 29 Python
python使用socket连接远程服务器的方法
Apr 29 Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
详解django2中关于时间处理策略
Mar 06 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
Jul 06 Python
Python 共享变量加锁、释放详解
Aug 28 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 Python
如何利用Python实现一个论文降重工具
Jul 09 Python
如何在python中实现ECDSA你知道吗
Nov 23 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+DBM的同学录程序(2)
2006/10/09 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
javascript如何使用bind指定接收者
2014/05/04 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
基于jQuery实现弹幕APP
2017/02/10 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
web.py获取上传文件名的正确方法
2014/08/26 Python
Python实现获取某天是某个月中的第几周
2015/02/11 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python输出指定月份日历的方法
2015/04/23 Python
Python实现身份证号码解析
2015/09/01 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Django 用户认证组件使用详解
2019/07/23 Python
Django密码存储策略分析
2020/01/09 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
Gweniss格温妮丝女包官网:英国纯手工制造潮流包包品牌
2018/02/07 全球购物
仓库门卫岗位职责
2013/12/22 职场文书
社会调查研究计划书
2014/05/01 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
创业计划书之甜品店
2019/09/18 职场文书
python实现批量移动文件
2021/04/05 Python
浅谈golang 中time.After释放的问题
2021/05/05 Golang
golang 实用库gotable的具体使用
2021/07/01 Golang