python运行pyc文件_Python中你不知道的pyc文件
## Python细说pyc
### 1. Python是一门解释型语言?
相信听说过或在学python的同学都听说过“Python是一门解释性语言”,如果细心的同学,应该会留意到*.pyc的文件,这个文件是什么时候生成的,它究竟有什么作用呢?
今天就来帮大家解解疑惑,如果大家对解释型语言和编译型语言不太明白的,建议先看看《编程基础——解释型语言和编译型语言》
### 2. 执行“python a.py”时发生了什么
当我们在命令行输入```python a.py```时,实际上是激活了Python的解释器,然而在真正运行代码前,它还是需要对代码进行一次解释过程。
### 3. 什么情况下会生成pyc
#### 环境说明
* Python版本:3.6
* Centos 7
#### print_hello.py
print("I am "+__name__)
print('hello')
#### import_hello.py
import print_hello
#### 直接运行脚本:不生成
[root@teach tmp]# python print_hello.py
I am __main__
hello
[root@teach tmp]# ls
import_hello.py print_hello.py
#### 模块导入:生成
[root@teach tmp]# python import_hello.py
I am print_hello
hello
[root@teach tmp]# ls
import_hello.py print_hello.py print_hello.pyc
#### 注意
* 在windows下,python3下pyc文件是生成在当前目录下的__pycache__目录
* 有兴趣的同学可以自己测试一下
### 4. pyc设计的目的
通过测试发现,pyc文件只有在文件被当成模块导入时才会生成。也就是说,Python解释器认为,只有import进行的模块才需要被重用。
生成pyc文件的好处显而易见,当我们多次运行程序时,不需要重新对该模块进行重新的解释。
如果我的需要直接执行的print_hello.py文件也需要重复生成pyc文件怎么办呢?python提供了方法。
### 5. pyc的过期时间
* Python解释器会把模块持久化成了pyc文件,那么当模块发生了改变的时候怎么办?需要手动删除吗?
* 可以通过查看源码得到以下结论
* 在写入pyc文件的时候,写了一个Long型变量,变量的内容则是文件的最近修改日期
* 每次在载入之前都会先检查一下py文件和pyc文件保存的最后修改日期,如果不一致则重新生成一份pyc文件
### 6. Python运行过程
#### PyCodeObject与pyc文件
* PyCodeObject则是Python编译器真正编译成的结果,存放到内存
* pyc文件其实是PyCodeObject的一种持久化保存方式
#### 直接执行
* Python解释器会对脚本进行一次解释,将结果保存在内存中的PyCodeObject中
* 程序运行
#### import导入
* 当Python程序被导入时,会先在硬盘中寻找pyc文件
* 若找到pyc文件,并确认文件为最新,则直接使用
* 若未找到或py文件做过修改,则先对模块进行解释,并将结果写回到pyc文件中,然后使用
### 一些启示
其实了解Python程序的执行过程对于大部分程序员,包括Python程序员来说意义都是不大的,那么真正有意义的是,我们可以从Python的解释器的做法上学到什么,我认为有这样的几点:
A. 其实Python是否保存成pyc文件和我们在设计缓存系统时是一样的,我们可以仔细想想,到底什么是值得扔在缓存里的,什么是不值得扔在缓存里的。
B. 在跑一个耗时的Python脚本时,我们如何能够稍微压榨一些程序的运行时间,就是将模块从主模块分开。(虽然往往这都不是瓶颈)
C. 在设计一个软件系统时,重用和非重用的东西是不是也应该分开来对待,这是软件设计原则的重要部分。
D. 在设计缓存系统(或者其他系统)时,我们如何来避免程序的过期,其实Python的解释器也为我们提供了一个特别常见而且有效的解决方案。
### 参考
[博客园-飞林沙](http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html)
python运行pyc文件_Python中你不知道的pyc文件相关推荐
- python 写txt 换行_python中写入txt文件需要换行,以及\r 和\n
在Python中,用open()函数打开一个txt文件,写入一行数据之后需要一个换行 如果直接用 f.write('\n') 只会在后面打印一个字符串'\n',而不是换行' 需要用 f.write(' ...
- python中with open写csv文件_Python中的CSV文件使用with语句的方式详解
是否可以直接使用with语句与CSV文件?能够做这样的事情似乎很自然: import csv with csv.reader(open("myfile.csv")) as read ...
- python db文件_python中查看.db文件中表格的名字及表格中的字段操作
1.问题描述: 我桌面上有一个"账号密码.db"文件,我现在想知道里面有几张表格table.表格的名字.表头结构. 2.使用SQL语句"""selec ...
- python modbus类封装_Python 中引入一个文件,模块的概念
Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块. 通过这些强大的模块可以极大地提高开 ...
- python判断最后一行_python中如何判断文件的最后一行是空行?
问题: 前两天遇到一个问题,比如dat和bcp文件的格式需要最后一行一定是空行.但是用python怎么也不能读到最后一行的空行. test1: file_obj = open(file_name) a ...
- python处理nc数据_python中的.nc文件处理 | 04 利用矢量边界提取NC数据
利用矢量边界提取.nc数据 import os import numpy as np import pandas as pd import matplotlib.pyplot as plt impor ...
- python找到文件夹下指定文件类型_python 读取指定文件夹中的指定文件类型的文件名...
C# 读取指定文件夹中的全部文件,并按规则生成SQL语句! 本实例的目的在于: 1 了解怎样遍历指定文件夹中的全部文件 2 控制台怎样输入和输出数据 代码: using System; using S ...
- python算法和数据结构_Python中的数据结构和算法
python算法和数据结构 To 至 Leonardo da Vinci 达芬奇(Leonardo da Vinci) 介绍 (Introduction) The purpose of this ar ...
- python打不开xls文件,wps下用vba实现合并文件夹中所有excel文件
python打不开xls文件,用wps下vba解决问题 用了常用的三种python读写xls文件的方法都报错 xlrd openpyxl pandas 原因 解决方法 用vba实现合并文件夹中所有ex ...
最新文章
- druid.io mysql 配置_druid.io 使用mysql存储metadata overlord启动出错
- 实验 4 [bx]和 loop 的使用
- springcloud-05-ribbon中不使用eureka
- 【英语学习】【WOTD】sentient 释义/词源/示例
- cacti气象图调整(批量位置调整、更改生成图大小等)
- WCF服务重构实录(中)
- XenCenter创建VM过程
- 代码该怎么写——设计原则
- 2023最新猕猴桃影视系统源码/影视APP源码+安卓/苹果双端
- 【图像识别】基于模板匹配算法求解车牌识别问题matlab代码含GUI界面
- SpringBoot使用EasyExcel 模板填充数据并导出,以及Excel导入解析入库
- windows 操作系统安全运维所考虑的安全基线内容
- linux下僵尸进程(<defunct>进程)的产生与避免
- LaTeX的入门使用(新手使用向)
- 《从你的全世界路过》之稻城
- HTML网页设计:周杰伦网站
- 「分布式架构」最终一致性:反熵
- NX二次开发-NXOPEN C# Part.GetPreviewImage读取prt文件预览图
- 网络安全行业需要工匠精神吗?
- BIM软件 Bentley OpenRoads Designer道路设计软件功能