Python 相关文件常见的后缀名详解[通俗易懂]

大家好,很高兴再次与大家见面,我是全栈君。

Python 文件常见的后缀名包括:

py

pyc

pyo

pyi

pyw

pyd

pyx

等。本文将重点介绍其中较为常见的几种后缀名。至于一些较为冷门的文件格式,如

pyz

pywz

rpy

pyde

pyp

pyt

等,由于资料稀少,网上相关文章大多来源相同且内容简略,因此本文不作深入探讨。

py

是最常见的 Python 源代码文件。

实际上,如果使用

python + 文件

的方式运行代码,只要文件内容相同,后缀名并不重要。以下运行结果是等价的:

python test.pypython test.txtpython test

pyc

是常见的 Python 字节码缓存文件。

立即学习“Python免费学习笔记(深入)”;

pyc

文件和

py

文件一样可以直接执行,以下运行结果是等价的:

python test.pypython test.pyc

pyc

文件有两个主要作用:

作用一:提升加载性能。当 Python 代码执行时,首先由 Python 解析器翻译成 PyCodeObject 对象(字节码),然后由 Python 解释器执行。每次运行程序时,翻译后的字节码保存在内存中,程序结束后即消失。为了提高加载效率,Python 会在程序结束后将每个文件的字节码写入硬盘,保存为

xxx.pyc

文件。这样,下次执行该程序时,如果目录中有对应的

xxx.pyc

文件且修改时间与

xxx.py

文件一致,就可以直接读取

xxx.pyc

文件执行,而无需再次翻译成字节码。尽管这种缓存方式对性能提升的效果有限,但在大型项目中效果显著。

默认情况下,并不是所有的

py

文件都会自动生成

pyc

文件,只有被其他文件 import 的文件才会生成对应的

pyc

文件。可以通过一个简单的实验来验证:新建两个 Python 文件

hello.py

import.py

,内容如下:

# hello.pyprint("hello")
# import.pyimport hello

直接运行

python hello.py

不会生成

pyc

文件,而运行

python import.py

会在当前目录下生成

hello.py

对应的

pyc

文件。

Python2 和 Python3 在生成

pyc

文件时有所不同:Python2 会在当前目录下生成同名的

pyc

文件,而 Python3 会在当前目录下创建

__pycache__

文件夹,并在其中生成包含 Python 版本信息的

xxx.cpython-37.pyc

文件。

Python2

Python 相关文件常见的后缀名详解[通俗易懂]

Python3

Python 相关文件常见的后缀名详解[通俗易懂]

作用二:隐藏源代码。

pyc

格式是为解释器设计的二进制文件,直接用编辑器打开会显示乱码。将 Python 代码编译成

pyc

文件后再交付使用,可以在一定程度上隐藏源代码。

默认情况下,主文件不会生成

pyc

文件,但可以通过 Python 自带的

py_compile

compileall

库,手动将所有

py

文件编译成

pyc

文件。

python -m py_compile *.pypython -m compileall *.py

Python2

Python 相关文件常见的后缀名详解[通俗易懂]

Python3

Python 相关文件常见的后缀名详解[通俗易懂]

反编译

pyc

文件。虽然

pyc

文件可以一定程度上隐藏源代码,但可以通过反编译工具恢复源码。

uncompyle6

是一个专门用于将

pyc

文件反编译为

py

源码的第三方库,安装方式如下:

pip install uncompyle6

执行以下命令可以将生成的

pyc

文件反编译为

py

文件:

uncompyle6 -o . *.pyc

Python 相关文件常见的后缀名详解[通俗易懂]

打开生成的文件

hello.cpython-37.py

import.cpython-37.py

,可以看到与之前的

py

代码内容完全相同,只是多了一些 Python 版本信息。

Python 相关文件常见的后缀名详解[通俗易懂]

要了解更多关于防止反编译的技术,请参考文章:通过字节码混淆来保护Python代码。

pyo

是优化后的 Python 字节码缓存文件。

pyo

文件的作用与

pyc

文件相似,唯一的区别

pyo

文件去除了断言语句(

assert

语句)。可以使用

py_compile

compileall

库将示例文件编译成

pyo

文件,只需添加

-O

参数,运行结果没有任何变化:

python -O -m py_compile *.pypython -O -m compileall *.py

Python 相关文件常见的后缀名详解[通俗易懂]

从 Python3.5 开始,Python 只使用

pyc

文件,不再使用

pyo

文件。因此,以下命令无法生成

pyo

文件,生成的依然是

pyc

文件:

python3 -O -m py_compile *.pypython3 -O -m compileall *.py

Python 相关文件常见的后缀名详解[通俗易懂]

pyi

是 Python 的存根文件,用于代码检查时的类型提示。

通义万相 通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相 596 查看详情 通义万相

pyi

文件是

PEP484

提案规定的用于 Python 代码类型提示(Type Hints)的文件。

PEP

(Python Enhancement Proposals)是经过 Python 社区核心开发者讨论并一致同意后发布的正式规范文档,如 Python 之禅(

PEP20

)、代码风格

PEP8

格式化(

PEP8

)、将

print

改为函数(

PEP3105

)等。要了解更多关于

PEP

的信息,请参考文章:学习Python,怎能不懂点PEP呢?。

常用的 IDE 都有类型检查提示功能,例如在 PyCharm 中,当给一个函数传入错误类型时会给出提示。这不是 IDE 的特殊开发功能,而是集成了

PEP484

的规定,利用了预先生成的

pyi

文件。

例如,

os.makedirs

标准库中用于创建文件夹路径的函数,其入参应为字符串类型。如果传入一个

int

类型,IDE 会立刻给出提示。

Python 相关文件常见的后缀名详解[通俗易懂]

按住

ctrl

键点进去,会进入到

os

模块定义

os.makedirs

的地方,发现前面有一个

*

号,鼠标放上去会提示

Has stub item in __init__.pyi

Python 相关文件常见的后缀名详解[通俗易懂]

点击

*

号会跳转到对应的

__init__.pyi

文件,该文件按照

PEP484

规定,为

os

模块的每个函数定义了对应的类型检查规则。

Python 相关文件常见的后缀名详解[通俗易懂]

关于

pyi

文件的定义规则及如何生成,请参考官方文档:PEP 484 – Type Hints。

pyw

是一种 Python 源代码文件,通常只存在于 Windows 系统。

pyw

文件和

py

文件除了后缀名不同外没有任何区别,两者都是 Python 源码文件。如前所述,“如果使用

python + 文件

的方式运行代码,只要文件内容相同,后缀名并不重要”,这一点在 Windows 和 Linux 系统上都是一致的。

在 Windows 系统上,新建两个内容相同的 Python 文件

hello.py

hello.pyw

,使用

python + 文件

的方式运行,结果相同:

# hello.pyprint("hello")
# hello.pywprint("hello")

Python 相关文件常见的后缀名详解[通俗易懂]

那么,为什么还需要

pyw

文件呢?

在 Windows 系统上,双击文件时,系统会根据文件扩展名调用关联的

exe

程序来运行该文件。打开 Python 安装目录,可以看到有

python.exe

pythonw.exe

两个

exe

文件,其中

python.exe

关联了

py

文件,

pythonw.exe

关联了

pyw

文件。与

python.exe

相比,

pythonw.exe

运行时不会弹出控制台窗口,

stdout

stderr

stdin

都无效,因此像

print

这种将内容输出到

stdout

的操作不会有打印结果(因为没有 cmd 窗口显示)。

Python 相关文件常见的后缀名详解[通俗易懂]

因此,在开发 Python GUI 程序时,如果不想让程序运行时弹出黑色的 cmd 窗口,可以将源码文件的后缀名改为

pyw

格式。不过,我个人认为

pyw

格式的实际用处不大,因为很少有人通过双击

py

pyw

文件来运行 Python 代码。我之前使用

tkinter

开发带 Windows 界面的 Python 程序时,是通过双击

bat

脚本启动 Python 脚本来避免弹出黑框框的。

pyd

是 Python 可直接调用的 C 语言动态链接库文件,通常只存在于 Windows 系统。

Python 是一种胶水语言,可以将对速度要求较高的代码使用 C 语言编写,编译成动态链接库文件,再通过 Python 调用。一般来说,在 Linux 上是

so

文件,在 Windows 系统上是

DLL

文件。

例如,有一个 C 语言编写的 Windows 动态链接库

test_lib.dll

,编译前的代码如下:

int sum(int x, int y){        return x + y;}

可以在 Python 代码中通过以下方式调用:

# test_lib.dll 放在当前目录下import ctypesfrom ctypes import *test_lib = ctypes.windll.LoadLibrary("test_lib.dll")a = ctypes.c_int(1)b = ctypes.c_int(2)out = test_lib.sum(a, b)print(out) # 3

在 Windows 系统上,Python 还有一种

pyd

格式的动态链接库。上述调用方式是先通过

ctypes.windll.LoadLibrary

方法将动态链接库加载进来,而

pyd

格式可以在 Python 代码中直接

import

进来,类似如下:

# test_lib.pyd 放在当前目录下import test_libout = test_lib.sum(1, 2)print(out) # 3

关于

pyd

文件和

DLL

文件的区别,请参考官方文档的说明。

C 语言代码和 Python 代码都可以通过一定的方法编译成

pyd

格式的文件,我个人没有实际使用过

pyd

文件,详细方法可参考以下文章:

使用C++创建Pyd文件扩展Python模块

Python源代码保护(Python文件编译生成pyd/so库文件)

pyx

是 Cython 源代码文件。

注意是 Cython 而不是 CPython。Cython 是一种结合了 Python 语法和 C/C++ 效率的编程语言。用 Cython 编写的代码可以很容易转成 C 语言代码,然后编译成动态链接库(

pyd

DLL

)供 Python 调用。因此,Cython 通常用于编写 Python 的 C 扩展。Cython 的源代码文件通常使用

pyx

后缀。

总结

后缀名 作用

py最常见的 Python 源代码文件。pyc常见的 Python 字节码缓存文件,可以反编译成 py 文件。pyo另一种 Python 字节码缓存文件,只存在于 Python2 及 Python3.5 之前的版本。pyiPython 的存根文件,常用于 IDE 代码格式检查时的类型提示。pyw另一种 Python 源代码文件,一般只存在于 Windows 系统。pyd一种 Python 可直接调用的 C 语言动态链接库文件,一般只存在于 Windows 系统。pyxCython 源代码文件,一般用来编写 Python 的 C 扩展。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://www.php.cn/link/81dd4df7529a4765132f4425191d1715

原文链接:https://www.php.cn/link/c8377ad2a50fb65de28b11cfc628d75c

以上就是Python 相关文件常见的后缀名详解[通俗易懂]的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/603048.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 21:29:12
下一篇 2025年11月10日 21:30:32

相关推荐

发表回复

登录后才能评论
关注微信