# pyc和bak文件

**pyc和bak文件**

第三方模块将创建.bak文件。\
示例-WinMerge:[winmerge documentation](https://manual.winmerge.org/en/Configuration.html)\
此外，开发人员过去还保留备份副本的命名方式，如“.bak、.old、.new等等”\
维基链接：[Bak File](https://en.wikipedia.org/wiki/Bak_file)\
（根据下面的win Merge文档指南）\
备份文件页\
此页允许您控制WinMerge如何创建备份文件。\
在中创建备份文件\
指定WinMerge应在何时创建备份文件。您可以单独启用或禁用这些选项：\
文件夹比较（默认情况下禁用）：每当覆盖（复制）文件时，都会创建备份文件。\
文件比较（默认启用）：每次保存文件时都会创建备份文件。\
将备份文件创建到\
指定创建备份文件的位置。只能启用以下选项之一：\
原始文件的文件夹（默认情况下启用）：备份文件与源文件在同一文件夹中创建。这通常是个不错的选择。缺点是清理大文件夹中的备份文件可能需要很多工作。\
全局备份文件夹（默认情况下禁用）：在一个全局文件夹中创建所有备份文件。这使它们易于清理。但是，如果有多个具有相同文件名的源文件，则最新的备份文件将覆盖相同名称的前一个备份文件。\
备份文件名\
当WinMerge创建备份文件时，它会在源文件名后面附加一个扩展名。您可以选择其中一个或两个扩展方案：\
Append.bak-扩展名（默认启用）：例如，file.txt备份到file.txt.bak。\
文件比较（默认启用）：时间戳几乎总是唯一的，因此此选项通常避免在源文件具有相同名称时复制备份文件名。\
此外，每次保存文件时存储该文件的副本提供了跟踪文件更改的方法。但是，您应该考虑这个选项可以创建很多文件。

**Python在什么时候会生成pyc文件呢？**

  事情大概是这样的，之前我一直以为python文件在执行过之后就会生成pyc文件，后来一次偶然情况下，发现还是自己too young too simple,在看过其他大神文章并且自己验证之后，发现还是有点意思的，权当没事写点文章吧。

**什么是pyc文件呢？**

  简单来说，pyc文件就是Python的字节码文件，我们都知道Python是一种全平台的解释性语言，全平台其实就是Python文件在经过解释器解释之后（或者称为编译）生成的pyc文件可以在多个平台下运行，这样同样也可以隐藏源代码。其实，Python是完全面向对象的语言，Python文件在经过解释器解释后生成字节码对象PyCodeObject，pyc文件可以理解为是PyCodeObject对象的持久化保存方式。

**什么时候会生成pyc文件呢？**

  pyc文件只有在文件被当成模块导入时才会生成。也就是说，Python解释器认为，只有import进行的模块才需要被重用。 生成pyc文件的好处显而易见，当我们多次运行程序时，不需要重新对该模块进行重新的解释。主文件一般只需要加载一次不会被其他模块导入，所以一般主文件不会生成pyc文件。\
  下面来举个例子说明，见代码

```
文件print_hello.py

print("hello")
```

```shell
import print_hello
```

执行python print\_hello.py

```
E:\test>python print_hello.py
hello

E:\test>dir
 驱动器 E 中的卷是 文件
 卷的序列号是 B612-D1B0

 E:\test 的目录

2017/09/25  21:09    <DIR>          .
2017/09/25  21:09    <DIR>          ..
2017/09/25  21:08                18 import_hello.py
2017/09/25  21:08                14 print_hello.py
               2 个文件             32 字节
               2 个目录 49,367,699,456 可用字节
```

可以发现并没有pyc文件生成，\
执行python import\_hello.py

```
E:\test>python import_hello.py
hello

E:\test>dir
 驱动器 E 中的卷是 文件
 卷的序列号是 B612-D1B0

 E:\test 的目录

2017/09/25  21:12    <DIR>          .
2017/09/25  21:12    <DIR>          ..
2017/09/25  21:08                18 import_hello.py
2017/09/25  21:08                14 print_hello.py
2017/09/25  21:12               124 print_hello.pyc
               3 个文件            156 字节
               2 个目录 49,367,699,456 可用字节
```

需要说明两点的是：

* 执行python import\_hello.py，开始执行import print\_hello，导入print\_hello模块，然后执行了print\_hello模块里面的代码，所以我们可以看到有“hello”输出；
* 如果不想执行里面的代码，一般可以将代码封装在一个类或者函数里面，然后加个if判断，类似下面这样，表示如果是被导入则不执行if下的代码，如果作为程序入口或者脚本执行，则执行if下的代码。

```
if __name__ == "__main__":
    print("hello")
```

**pyc文件的过期时间**

* 在生成pyc文件的同时，写入了一个Long型的变量，用于记录最近修改的时间；
* 每次载入之前都先检查一下py文件和pyc文件的最后修改日期，如果不一致则会生成一个新的pyc文件

**总结**

  总的来说，了解pyc其实对于Python开发者来说并没有多大的意义，本着钻研的精神写下这篇文章，感觉有一下几点可以考虑

* Python的pyc文件从一定意义上可以减少解释器解释Python文件的时间，不必每次都要解释编译一遍，方便下次快速加载，有点类似数据库的缓存吧；
* 想想如果我们想设计一个系统，类似主文件这种不会被重用，而其他模块可能会被重用，我们就需要分开设计对待了吧；
* 在设计缓存系统时候，类似Python这种对比最后修改时间的方式，是不是可以给我们一点启示呢？


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://qiangrens-organization.gitbook.io/qkd90/fu-wu-qi-yun-wei-he-ce-shi/linux-fu-wu-qi/pyc-he-bak-wen-jian.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
