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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
Python Web框架Flask中使用新浪SAE云存储实例
Feb 08 Python
在Python中使用PIL模块处理图像的教程
Apr 29 Python
python 处理string到hex脚本的方法
Oct 26 Python
docker-py 用Python调用Docker接口的方法
Aug 30 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
python中的 zip函数详解及用法举例
Feb 16 Python
keras中的backend.clip用法
May 22 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 Python
十个Python自动化常用操作,即拿即用
May 10 Python
python 判断文件或文件夹是否存在
Mar 18 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
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
jQuery ajax 路由和过滤器使用说明
2011/08/02 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
javascript常用的方法分享
2015/07/01 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
探索JavaScript中私有成员的相关知识
2019/06/13 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
对python3新增的byte类型详解
2018/12/04 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
广播节目策划方案
2014/05/23 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
李强感恩观后感
2015/06/17 职场文书