Python文件扩展名 .pyc .pyd .pyo 分别代表什么意思?

499

这些Python文件扩展名代表什么意思?

  • .pyc:Python编译字节码文件
  • .pyd:Windows平台的Python动态链接库
  • .pyo:已优化的Python编译字节码文件

它们之间有什么区别,以及它们如何从*.py文件生成?

3个回答

552
  1. .py:通常是您编写的输入源代码。
  2. .pyc:这是编译后的字节码。如果您导入一个模块,Python将构建一个包含字节码的*.pyc文件,以使以后再次导入更加容易(和更快)。
  3. .pyo:这是在Python 3.5之前用于带有优化标志(-O)的*.pyc文件的文件格式。(见下面的注释)
  4. .pyd:这基本上是Windows DLL文件。http://docs.python.org/faq/windows.html#is-a-pyd-file-the-same-as-a-dll

如果您想进一步讨论.pyc.pyo,请参阅以下链接:http://www.network-theory.co.uk/docs/pytut/CompiledPythonfiles.html(我已经复制了下面的重要部分)

当使用 -O 标志调用 Python 解释器时,将生成优化的代码并存储在 '.pyo' 文件中。目前,优化器帮助不大,它仅删除 assert 语句。使用 -O 时,所有字节码都会被优化;.pyc 文件将被忽略,.py 文件将被编译为优化的字节码。 将两个 -O 标志传递给 Python 解释器(-OO)将导致字节码编译器执行优化,这可能在某些罕见情况下导致程序出现故障。目前只有__doc__字符串从字节码中删除,从而产生更紧凑的 '.pyo' 文件。由于一些程序可能依赖于这些可用性,因此只有在知道自己在做什么时才应使用此选项。 当从 '。pyc' 或 '。pyo' 文件读取脚本时,程序运行速度并不比从 '。py' 文件读取时更快;关于 '。pyc' 或 '。pyo' 文件唯一更快的是它们加载的速度。 当通过在命令行上给出其名称来运行脚本时,脚本的字节码永远不会写入 '。pyc' 或 '。pyo' 文件。因此,通过将大部分代码移动到模块中并具有导入该模块的小型引导脚本,可以减少脚本的启动时间。也可以直接在命令行上命名 '。pyc' 或 '。pyo' 文件。
注意:
2015年9月15日,Python 3.5发布实施了PEP-488并删除了.pyo文件。这意味着.pyc文件同时代表未经优化和经过优化的字节码。

3
这些dll文件是由Python脚本还是C/C++脚本生成的? - Yanki Twizzy
2
@yankitwizzy:是的。它们应该从C/C ++代码生成。文件应该是机器码,所以不能直接从Python生成。 - Bill Lynch
"优化器目前并没有太大帮助,它只是删除了assert语句。" 你确定吗?试试这个代码:```def f(x): assert(x*5 == xxxx*x); return x;import timeit; print(timeit.repeat("for x in range(100): f(x)", "from main import f", number=10000));``` - Jorge Leitao
@BillLynch:包通常具有断言,删除断言确实有助于加快速度(评论中的代码只是一个简单的示例)。说“它没有太大帮助”对我来说似乎太苛刻了,因为从导入的代码中删除断言的后果特别是从使用断言的维护良好的包中删除断言。对于之前低质量的评论,我感到很抱歉。 - Jorge Leitao
12
注意,在Python 3.5中,实现了PEP 488,这消除了“.pyo”文件的概念。即使是优化过的字节码也以“.pyc”扩展名结束,因此在Python 3.5中不再有.pyo文件。 - Michael Currie
显示剩余2条评论

274
  • .py - 常规脚本
  • .py3 - (很少使用)Python3 脚本。Python3 脚本通常以 ".py" 结尾而不是 ".py3",但我有时见过使用 ".py3" 后缀的情况
  • .pyc - 编译的脚本(字节码)
  • .pyo - 优化后的 pyc 文件(Python3.5 开始,Python 只使用 pyc 而不再使用 pyo 和 pyc)
  • .pyw - Python 脚本以窗口模式运行,没有控制台;使用 pythonw.exe 执行
  • .pyx - Cython 源文件,将被转换为 C/C++
  • .pyd - 创建为 Windows DLL 的 Python 脚本
  • .pxd - 用于 cimport 的 Cython 现代头文件。
  • .pxi - 用于原始文本 include 的 Cython 旧头文件。
  • .pyi - 存根文件 (PEP 484)
  • .pyz - Python 脚本归档文件 (PEP 441);这是一个包含压缩的 Python 脚本文件 (ZIP) 的脚本,位于标准 Python 脚本头之后的二进制形式中
  • .pyzw - 用于 MS-Windows 的 Python 脚本归档文件 (PEP 441);这是一个包含压缩的 Python 脚本文件 (ZIP) 的脚本,位于标准 Python 脚本头之后的二进制形式中
  • .py[cod] - 在 ".gitignore" 中的通配符表示该文件可以是 ".pyc"、".pyo" 或 ".pyd"。
  • .pth - 路径配置文件;其内容是要添加到 sys.path 中的其他项(每行一个)。参见 site 模块。
  • .egg - 用于分发/导入的特殊 zip 文件,自 PEP 427 后基本过时了
  • .whl - 仅用于分发的特殊 zip 文件,由 pip 广泛使用

一个更大的额外Python文件扩展名列表(主要是罕见和非官方的)可以在http://dcjtech.info/topic/python-file-extensions/找到。


14
需要翻译的内容:It should be noted that a «.pyx» file is not quite Python source which is converted to C, but rather Cython source code (i.e.: waiting to be converted to C)一个 «.pyx» 文件并不是被转换为 C 的 Python 源代码,而是 Cython 源代码(即等待转换为 C 的源代码)。 - Fred Osterrath
PYI扩展中的"I"代表什么?是"Include"(包含)/ "Implementation"(实现)/ "Interface"(接口)? - ChrisFreeman
1
.pyw 意味着创建窗口的 PYthon 脚本,而不是 Python 4 Windows。.pyw 可以在 *nix 下执行。 - Kotauskas
1
一般来说,.pyw是在窗口模式下运行的脚本,即没有控制台输出。正如@VladislavToncharov所述,如果安装了Python,则可以在支持Python的大多数平台上运行它们。 - Steve Barnes
1
这个答案应该讨论.pth文件。 - wim

1

.py :你编写的源代码文件。

.pyc:编译后的字节码文件。如果你导入一个模块,Python 将会创建一个.pyc文件, 包含字节码,以便于下次导入时更加容易和快速。

.pyo:开启了优化选项(-O)的.pyc文件。

.pyd:Windows 下用于 Python 的 DLL 文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接