返回顶部
首页 > 资讯 > 后端开发 > Python >详解Python相关文件常见的后缀名
  • 444
分享到

详解Python相关文件常见的后缀名

2024-04-02 19:04:59 444人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

常见的 python 文件后缀有:py、pyc 、pyo、 pyi、pyw、 pyd、 pyx 等。 本文只介绍相对常见的一些后缀名,至于一些特别冷门的文件格式,例如一些文章提到的p

常见的 python 文件后缀有:pypycpyopyipywpydpyx 等。

本文只介绍相对常见的一些后缀名,至于一些特别冷门的文件格式,例如一些文章提到的pyzpywzrpypydepyppyt等,并没有进行研究。因为这些扩展名资料很少,网上搜到的文章似乎都是同一个出处,只是简单提了一句,说了等于没说。

py

最常见的 Python 源代码文件。

实际上如果用 python + 文件 的方式运行代码,只要文件内容相同,后缀名是不重要的,也就是说下面的运行结果都是等价的:


python test.py
python test.txt
python test

pyc

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

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


python test.py
python test.pyc

作用一:提升加载性能

我们知道 Python 代码在执行时,会先由 Python 解析器翻译成 PyCodeObject 对象,俗称字节码 (Byte code),然后交给 Python 解释器来执行字节码。

上述过程中翻译后的字节码是保存在内存中,程序运行结束就没了,而代码没有修改的情况下,每次生成的字节码是一样的,所以每次跑程序都再走一遍翻译字节码的过程有点浪费性能。因此为了提高加载效率,Python 在程序执行结束后会把每个文件的字节码写入到硬盘中保存为 xxx.pyc 文件,这样下一次再执行这个程序时先在目录下找有没有xxx.pyc 文件,如果有这个对应文件且修改时间和xxx.py 文件的修改时间一样,就不用再执行翻译成字节码的过程,直接读取xxx.pyc 文件执行。其实缓存pyc 文件的方式对性能的提升很微小,只有项目文件非常多的时候才能看到显著提升。

默认情况下,我们发现并不是所有的py 文件都会自动生成pyc 文件,只有被其他文件 import 过的文件才会生成对应的pyc 文件。可能 Python 认为被 import 的文件重复使用的概率比较高,而主文件一般只需要加载一次。

简单做个实验可以验证,新建两个 Python 文件hello.pyimport.py,内容如下:


# hello.py
print("hello")

# import.py
impot hello

直接运行 python hello.py,并没有生成pyc 文件,而运行python import.py,在当前目录下生成了hello.py对应的pyc 文件。

这里 Python2 和 python3 有些不同, Python2 是直接在当前目录下生成同名 pyc 文件,Python3 是在当前目录下创建了__pycache__文件夹,然后在文件夹内创建了一个包含 Python 版本信息的xxx.cpython-37.pyc 文件。

Python2

在这里插入图片描述

Python3

在这里插入图片描述

作用二:隐藏源代码

pyc格式是给解释器看的二进制文件,直接用编辑器打开看上去是乱码,所以将 Python 代码先编译成pyc文件再交付给别人使用,一定程度上实现隐藏源代码的效果。

默认情况下,主文件不会生成pyc文件,可以通过 Python 自带的py_compilecompileall 库,手动将所有py文件"编译"成pyc文件。


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

Python2

在这里插入图片描述

Python3

在这里插入图片描述

反编译 pyc

前面说了,是“一定程度上实现隐藏源代码的效果”,其实可以通过反编译pyc文件来获得py源码,而且反编译的难度并不大。

uncompyle6是一个专门用于将pyc反编译为py源码的第三方库,安装方式:


pip install uncompyle6

执行下面命令可以将刚才生成的pyc反编译为py文件:


uncompyle6 -o . *.pyc

在这里插入图片描述

打开生成的文件hello.cpython-37.pyimport.cpython-37.py,可以看到和之前的py代码内容一模一样,不过多了一些 Python 的版本信息。

在这里插入图片描述

魔高一尺,道高一丈,有反编译技术就有防止反编译技术,更多了解参见这篇文章:通过字节码混淆来保护Python代码。

pyo

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

pyo文件的作用和pyc文件没啥区别,唯一的优化就是去掉了断言语句,即assert语句。官方文档描述:

When the Python interpreter is invoked with the -O flag, optimized code is generated and stored in .pyo files. The optimizer currently doesn't help much; it only removes assert statements. When -O is used, all bytecode is optimized; .pyc files are ignored and .py files are compiled to optimized bytecode.

同样可以利用py_compilecompileall 库将上面示例的两个文件编译成pyo文件,只是多加一个参数-O,运行结果也没有任何变化:


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

在这里插入图片描述

从 Python3.5 开始,Python 只使用 pyc 而不再使用pyo,所以下面命令也无法生成 pyo文件,生成的依然是 pyc 文件:


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

在这里插入图片描述

pyi

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

pyi文件是PEP484提案规定的一种用于 Python 代码类型提示(Type Hints)的文件。PEPPython Enhancement Proposals,是经过 Python 社区核心开发者讨论并一致同意后,对外发布的一些正式规范文档,例如我们常说的Python之禅(PEP20),代码风格 PEP8 格式化(PEP8),将 print 改为函数(PEP3105)等,关于PEP的更多了解见这篇文章:学习Python,怎能不懂点PEP呢?。

常用的 IDE 都会有类型检查提示功能,比如在 PyCharm 中,当我们给一个函数传入一个错误的类型时会给出对应的提示,这其实不是 IDE 的特殊开发的功能,它只是集成了PEP484的规定,利用了已经预先生成好的 pyi文件。

举个例子,os.makedirs是标准库中用于创建文件夹路径的函数,它的入参应该是一个字符串类型,如果传入一个 int 类型,IDE 会立刻给出提示。

在这里插入图片描述

按住ctrl点进去,进入到 os 模块定义os.makedirs的地方,发现前面有个*号,鼠标放上去会提示Has stub item in __init__.pyi

在这里插入图片描述

点击*号就会跳到对应的__init__.pyi文件,这个文件里按照PEP484规定,为os模块每个函数都定义了对应的类型检查规则。

在这里插入图片描述

关于pyi文件的定义规则以及自己如何生成,详见官方文档:PEP 484 – Type Hints

pyw

一种 Python 源代码文件,一般只存在于 windows 系统。

pyw文件和py文件除了后缀名不一样之外没有任何区别,两者都是 Python 源码文件,前面 py那一节说过“如果用 python + 文件 的方式运行代码,只要文件内容相同,后缀名是不重要的”,这一点在 Windows 系统和 linux 系统都是一样的。

Windows 系统,新建两个内容相同的 Python 文件hello.pyhello.pyw,用python + 文件 的方式运行,结果一样:


# hello.py
print("hello")

# hello.pyw
print("hello")

在这里插入图片描述

那为什么还要有pyw文件呢?

在Windows 系统上双击文件时,系统会根据文件扩展名来调用关联的exe程序来运行这个文件,打开 Python 安装目录,可以看到有python.exepythonw.exe两个exe,其中python.exe关联了py文件,pythonw.exe关联了pyw文件。跟 python.exe 相比,pythonw.exe运行时不会弹出控制台窗口, stdout 、stderr 和 stdin 都无效,所以像 print 这种把内容输出到 stdout 的操作就不会有打印结果(cmd 窗口都没有了也没有地方显示了)。

在这里插入图片描述

所以在用 Python 开发 GUI 程序时,如果不想让程序运行的时候弹出一个黑乎乎的 cmd 框,就可以将源码文件后缀名改为pyw格式。但是我感觉这个pww格式用处并不大,实际使用很少有人双击py或者pyw文件来运行 Python 代码。我之前曾用tkinter开发过带 Windows 界面的 Python 程序,当时是通过双击 bat脚本启动 Python 脚本同时关闭 cmd 界面框,来避免弹出黑框框的。

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 ctypes
from 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_lib

out = test_lib.sum(1, 2)
print(out) # 3

关于 pyd文件和dll文件的区别,可参考官方文档的说明:

Is a *.pyd file the same as a DLL?

Yes, .pyd files are dll's, but there are a few differences. If you have a DLL named foo.pyd, then it must have a function PyInit_foo(). You can then write Python “import foo”, and Python will search for foo.pyd (as well as foo.py, foo.pyc) and if it finds it, will attempt to call PyInit_foo() to initialize it. You do not link your .exe with foo.lib, as that would cause Windows to require the DLL to be present.

Note that the search path for foo.pyd is PYTHONPATH, not the same as the path that Windows uses to search for foo.dll. Also, foo.pyd need not be present to run your program, whereas if you linked your program with a dll, the dll is required. Of course, foo.pyd is required if you want to say import foo. In a DLL, linkage is declared in the source code with __declspec(dllexport). In a .pyd, linkage is defined in a list of available functions.

C 语言代码和 Python 代码都可以通过一定的方法编译成pyd格式的文件,本人并没有实际使用过pyd文件

PyTorch中的c++扩展实现  https://www.jb51.net/article/184030.htm

Python文件编译生成pyd/so库  Https://www.jb51.net/article/148711.htm

pyx

Cython 源代码文件。

注意是 Cython 不是 CPython。Cython 可以说是一种编程语言, 它结合了Python 的语法和有 C/C++的效率,用 Cython 写完的代码可以很容易转成 C 语言代码,然后又可以再编译成动态链接库(pyddll)供 Python 调用,所以 Cython 一般用来编写 Python 的 C 扩展,上面说的 Python 文件编译生成 pyd 文件就是利用 Cython 来实现的 。Cython 的源代码文件一般为pyx后缀。

总结

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

到此这篇关于Python 相关文件常见的后缀名详解的文章就介绍到这了,更多相关Python 文件后缀名内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Python相关文件常见的后缀名

本文链接: https://lsjlt.com/news/125166.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 详解Python相关文件常见的后缀名
    常见的 Python 文件后缀有:py、pyc 、pyo、 pyi、pyw、 pyd、 pyx 等。 本文只介绍相对常见的一些后缀名,至于一些特别冷门的文件格式,例如一些文章提到的p...
    99+
    2024-04-02
  • python读取文件名及后缀详解
    目录os.listdir()实验代码:输出:结果分析:os.path.splitext()实验代码:输出:结果分析:os.path.split()实验代码:输出:结果分析:案例分析思...
    99+
    2024-04-02
  • 常见域名的后缀有哪些
    常见的有com、cn、net、org、top、vip、此外还有gov、edu等专属域名后缀。com域名,初期表示商业机构注册使用此域名的目的,不过现在已经没有这方面的限制了。top域名,是新通用顶级域名注册量最高的域名后缀,代表突破含义,企...
    99+
    2024-04-02
  • 有哪些常见域名的后缀
    常见的域名后缀有:1.com,商业组织;2.com.cn,中国地区商业组织;3.net,互联网;4.hk,香港地区;5.org,非盈利组织机构;7.edu,教育机构;8.art,艺术与文化领域等。常见的域名后缀有以下几种.com:代表商业组...
    99+
    2024-04-02
  • python怎么修改文件名后缀
    使用python修改文件名后缀的方法:1.新建python项目;2.导入os模块;3.定义文件路径;4.使用os.split()方法获取文件名;5.使用os.splitext()方法获取文件后缀;6.使用os.rename()方法修改后缀名...
    99+
    2024-04-02
  • 常见的国内域名后缀有哪些
    常见的国内域名后缀有:1. .cn(中国)2. .com.cn(中国商业)3. .net.cn(中国网络)4. .org.cn(中国...
    99+
    2023-06-12
    国内域名 域名
  • css3文件的后缀名是什么
    这篇文章主要介绍“css3文件的后缀名是什么”,在日常操作中,相信很多人在css3文件的后缀名是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”css3文件的后缀名是什么”...
    99+
    2024-04-02
  • Go语言获取文件的名称、前缀、后缀
    示例代码: package main import ( "fmt" "path" ) func main() { filename := "devic...
    99+
    2022-06-07
    GO go语言
  • 与python相关的文件扩展名
      在开始之前,先简单说说python如何工作: 一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候...
    99+
    2023-01-31
    文件扩展名 python
  • 文件不显示后缀名如何解决
    这篇文章给大家介绍文件不显示后缀名如何解决,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。解决方法:鼠标双击电脑桌面【此电脑】进入此电脑后,点击左上角【文件】点击文件菜单里的【更改文件夹和搜索选项】在文件夹选项里面,点击...
    99+
    2023-06-14
  • php怎么删除文件名的后缀
    这篇文章将为大家详细讲解有关php怎么删除文件名的后缀,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。可以用str_replace函数举例一:<php $filename="help...
    99+
    2023-05-31
    php
  • deepinv20linux怎么修改文件后缀?Linux系统修改文件后缀名的技巧
    今天需要给deepin v20 linux系统的文件重命名,但是发现鼠标右键给文件重命名,文件的后缀名就不见了,无法对后缀名进行修改,其实这是因为deepin默认后缀名无法编辑,需要修改配置,下面我们就来看看详细的设置方法。 ...
    99+
    2022-06-05
    Linux 后缀名 deepinv20 修改后缀名
  • Python常见文件操作的示例详解
    目录从文件中读取数据为什么要提供文件路径逐行读取创建一个包含文件各行内容的列表使用文件中的内容包含千位以上的大型文件圆周率中包含你的生日吗写入文件附加到文件从文件中读取数据 1:读取...
    99+
    2024-04-02
  • 详解Xshell 常见问题及相关配置
    本文介绍Xshell 常见的问题以及相关的配置。本文的配置主要是针对 Xshell 5 或 Xshell 6 版本的。 说明:涉及到对"属性"进行的配置,如果当前Xshell已经连接到了一台服务器,那么在此会话窗口中进行...
    99+
    2022-06-04
    Xshell常见问题 Xshell 配置
  • Go语言如何获取文件的名称、前缀、后缀
    这篇文章主要介绍Go语言如何获取文件的名称、前缀、后缀,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!go是什么golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的...
    99+
    2023-06-14
  • python如何删除文件夹中具有相同后缀类型文件
    今天小编给大家分享一下python如何删除文件夹中具有相同后缀类型文件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用背景...
    99+
    2023-07-05
  • python如何获取文件的后缀
    使用python获取文件的后缀的方法:1.新建python项目;2.导入os模块;3.使用os.split()方法文件名;4.使用os.splitext()方法获取文件后缀;具体步骤如下:首先,打开python,并新建一个python项目;...
    99+
    2024-04-02
  • php怎么获取不带后缀的文件名
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑php获取不带后缀的文件名的方法1、使用basename()函数basename() 函数返回路径中的文件名部分。语法:basename(path,suffix)参数p...
    99+
    2016-10-30
    php 文件名 后缀后缀
  • php获取文件后缀名的几种方法
    获取文件后缀的方法有很多种, 差不多能总结出7,8种,原理基本上都分成两种。 第一种: 得到文件名中最后一个“.”的位置,然后再进行截取; 第二种: 用explode将文件名以“.”进行分割成数组,再取数组中最后一个值。 具体实现源码参考:...
    99+
    2023-09-20
    php 服务器 开发语言
  • 电脑中的文件后缀名如何更改
    这篇文章主要讲解了“电脑中的文件后缀名如何更改”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“电脑中的文件后缀名如何更改”吧!下面以文本文件为例:更改txt文件后缀为doc,文件依旧为txt文...
    99+
    2023-06-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作