最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python相關(guān)文件常見的后綴名

 更新時間:2021年05月06日 09:51:03   作者:杰克小麻雀  
常見的 Python 文件后綴有:py、pyc 、pyo、 pyi、pyw、 pyd、 pyx 等。本文給大家介紹Python相關(guān)文件常見的后綴名,感興趣的朋友跟隨小編一起看看吧

常見的 Python 文件后綴有:py、pyc 、pyo、 pyipyw、 pydpyx 等。

本文只介紹相對常見的一些后綴名,至于一些特別冷門的文件格式,例如一些文章提到的pyz、pywz、rpy、pyde、pyp、 pyt等,并沒有進(jìn)行研究。因為這些擴(kuò)展名資料很少,網(wǎng)上搜到的文章似乎都是同一個出處,只是簡單提了一句,說了等于沒說。

py

最常見的 Python 源代碼文件。

實際上如果用 python + 文件 的方式運行代碼,只要文件內(nèi)容相同,后綴名是不重要的,也就是說下面的運行結(jié)果都是等價的:

python test.py
python test.txt
python test

pyc

常見的 Python 字節(jié)碼緩存文件。

pyc文件和py文件一樣,都可以直接執(zhí)行,下面的運行結(jié)果都是等價的:

python test.py
python test.pyc

作用一:提升加載性能

我們知道 Python 代碼在執(zhí)行時,會先由 Python 解析器翻譯成 PyCodeObject 對象,俗稱字節(jié)碼 (Byte code),然后交給 Python 解釋器來執(zhí)行字節(jié)碼。

上述過程中翻譯后的字節(jié)碼是保存在內(nèi)存中,程序運行結(jié)束就沒了,而代碼沒有修改的情況下,每次生成的字節(jié)碼是一樣的,所以每次跑程序都再走一遍翻譯字節(jié)碼的過程有點浪費性能。因此為了提高加載效率,Python 在程序執(zhí)行結(jié)束后會把每個文件的字節(jié)碼寫入到硬盤中保存為 xxx.pyc 文件,這樣下一次再執(zhí)行這個程序時先在目錄下找有沒有xxx.pyc 文件,如果有這個對應(yīng)文件且修改時間和xxx.py 文件的修改時間一樣,就不用再執(zhí)行翻譯成字節(jié)碼的過程,直接讀取xxx.pyc 文件執(zhí)行。其實緩存pyc 文件的方式對性能的提升很微小,只有項目文件非常多的時候才能看到顯著提升。

默認(rèn)情況下,我們發(fā)現(xiàn)并不是所有的py 文件都會自動生成pyc 文件,只有被其他文件 import 過的文件才會生成對應(yīng)的pyc 文件??赡?Python 認(rèn)為被 import 的文件重復(fù)使用的概率比較高,而主文件一般只需要加載一次。

簡單做個實驗可以驗證,新建兩個 Python 文件hello.pyimport.py,內(nèi)容如下:

# hello.py
print("hello")
# import.py
impot hello

直接運行 python hello.py,并沒有生成pyc 文件,而運行python import.py,在當(dāng)前目錄下生成了hello.py對應(yīng)的pyc 文件。

這里 Python2 和 Python3 有些不同, Python2 是直接在當(dāng)前目錄下生成同名 pyc 文件,Python3 是在當(dāng)前目錄下創(chuàng)建了__pycache__文件夾,然后在文件夾內(nèi)創(chuàng)建了一個包含 Python 版本信息的xxx.cpython-37.pyc 文件。

Python2

在這里插入圖片描述

Python3

在這里插入圖片描述

作用二:隱藏源代碼

pyc格式是給解釋器看的二進(jìn)制文件,直接用編輯器打開看上去是亂碼,所以將 Python 代碼先編譯成pyc文件再交付給別人使用,一定程度上實現(xiàn)隱藏源代碼的效果。

默認(rèn)情況下,主文件不會生成pyc文件,可以通過 Python 自帶的py_compilecompileall 庫,手動將所有py文件"編譯"成pyc文件。

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

Python2

在這里插入圖片描述

Python3

在這里插入圖片描述

反編譯 pyc

前面說了,是“一定程度上實現(xiàn)隱藏源代碼的效果”,其實可以通過反編譯pyc文件來獲得py源碼,而且反編譯的難度并不大。

uncompyle6是一個專門用于將pyc反編譯為py源碼的第三方庫,安裝方式:

pip install uncompyle6

執(zhí)行下面命令可以將剛才生成的pyc反編譯為py文件:

uncompyle6 -o . *.pyc

在這里插入圖片描述

打開生成的文件hello.cpython-37.pyimport.cpython-37.py,可以看到和之前的py代碼內(nèi)容一模一樣,不過多了一些 Python 的版本信息。

在這里插入圖片描述

魔高一尺,道高一丈,有反編譯技術(shù)就有防止反編譯技術(shù),更多了解參見這篇文章:通過字節(jié)碼混淆來保護(hù)Python代碼。

pyo

優(yōu)化后的 Python 字節(jié)碼緩存文件。

pyo文件的作用和pyc文件沒啥區(qū)別,唯一的優(yōu)化就是去掉了斷言語句,即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文件,只是多加一個參數(shù)-O,運行結(jié)果也沒有任何變化:

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提案規(guī)定的一種用于 Python 代碼類型提示(Type Hints)的文件。PEPPython Enhancement Proposals,是經(jīng)過 Python 社區(qū)核心開發(fā)者討論并一致同意后,對外發(fā)布的一些正式規(guī)范文檔,例如我們常說的Python之禪(PEP20),代碼風(fēng)格 PEP8 格式化(PEP8),將 print 改為函數(shù)(PEP3105)等,關(guān)于PEP的更多了解見這篇文章:學(xué)習(xí)Python,怎能不懂點PEP呢?。

常用的 IDE 都會有類型檢查提示功能,比如在 PyCharm 中,當(dāng)我們給一個函數(shù)傳入一個錯誤的類型時會給出對應(yīng)的提示,這其實不是 IDE 的特殊開發(fā)的功能,它只是集成了PEP484的規(guī)定,利用了已經(jīng)預(yù)先生成好的 pyi文件。

舉個例子,os.makedirs是標(biāo)準(zhǔn)庫中用于創(chuàng)建文件夾路徑的函數(shù),它的入?yún)?yīng)該是一個字符串類型,如果傳入一個 int 類型,IDE 會立刻給出提示。

在這里插入圖片描述

按住ctrl點進(jìn)去,進(jìn)入到 os 模塊定義os.makedirs的地方,發(fā)現(xiàn)前面有個*號,鼠標(biāo)放上去會提示Has stub item in __init__.pyi。

在這里插入圖片描述

點擊*號就會跳到對應(yīng)的__init__.pyi文件,這個文件里按照PEP484規(guī)定,為os模塊每個函數(shù)都定義了對應(yīng)的類型檢查規(guī)則。

在這里插入圖片描述

關(guān)于pyi文件的定義規(guī)則以及自己如何生成,詳見官方文檔:PEP 484 – Type Hints

pyw

一種 Python 源代碼文件,一般只存在于 Windows 系統(tǒng)。

pyw文件和py文件除了后綴名不一樣之外沒有任何區(qū)別,兩者都是 Python 源碼文件,前面 py那一節(jié)說過“如果用 python + 文件 的方式運行代碼,只要文件內(nèi)容相同,后綴名是不重要的”,這一點在 Windows 系統(tǒng)和 Linux 系統(tǒng)都是一樣的。

Windows 系統(tǒng),新建兩個內(nèi)容相同的 Python 文件hello.pyhello.pyw,用python + 文件 的方式運行,結(jié)果一樣:

# hello.py
print("hello")
# hello.pyw
print("hello")

在這里插入圖片描述

那為什么還要有pyw文件呢?

在Windows 系統(tǒng)上雙擊文件時,系統(tǒng)會根據(jù)文件擴(kuò)展名來調(diào)用關(guān)聯(lián)的exe程序來運行這個文件,打開 Python 安裝目錄,可以看到有python.exepythonw.exe兩個exe,其中python.exe關(guān)聯(lián)了py文件,pythonw.exe關(guān)聯(lián)了pyw文件。跟 python.exe 相比,pythonw.exe運行時不會彈出控制臺窗口, stdout 、stderr 和 stdin 都無效,所以像 print 這種把內(nèi)容輸出到 stdout 的操作就不會有打印結(jié)果(cmd 窗口都沒有了也沒有地方顯示了)。

在這里插入圖片描述

所以在用 Python 開發(fā) GUI 程序時,如果不想讓程序運行的時候彈出一個黑乎乎的 cmd 框,就可以將源碼文件后綴名改為pyw格式。但是我感覺這個pww格式用處并不大,實際使用很少有人雙擊py或者pyw文件來運行 Python 代碼。我之前曾用tkinter開發(fā)過帶 Windows 界面的 Python 程序,當(dāng)時是通過雙擊 bat腳本啟動 Python 腳本同時關(guān)閉 cmd 界面框,來避免彈出黑框框的。

pyd

Python 可直接調(diào)用的 C 語言動態(tài)鏈接庫文件,一般只存在于 Windows 系統(tǒng)。

Python 是一種膠水語言,我們可以將對速度要求比較高的那一部分代碼使用 C 語言編寫,編譯成動態(tài)鏈接庫文件,再通過 Python 來調(diào)用。一般來說,在 Linux 上是 so文件,在 Windows 系統(tǒng)上是DLL文件。

例如有一個 C 語言編寫的 Windows 動態(tài)鏈接庫 test_lib.dll,編譯前的代碼如下:

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

我們可以在 Python 代碼中通過下面的方式來調(diào)用

# test_lib.dll 放在當(dāng)前目錄下
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 系統(tǒng)上,Python 還有一種 pyd格式的動態(tài)鏈接庫,上面的調(diào)用方式是先通過ctypes.windll.LoadLibrary 方法將動態(tài)鏈接庫加載進(jìn)來,而pyd格式就可以在 Python 代碼中直接import進(jìn)來,類似下面這樣:

# test_lib.pyd 放在當(dāng)前目錄下
import test_lib

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

關(guān)于 pyd文件和dll文件的區(qū)別,可參考官方文檔的說明

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++擴(kuò)展實現(xiàn)  http://www.fzitv.net/article/184030.htm

Python文件編譯生成pyd/so庫  http://www.fzitv.net/article/148711.htm

pyx

Cython 源代碼文件。

注意是 Cython 不是 CPython。Cython 可以說是一種編程語言, 它結(jié)合了Python 的語法和有 C/C++的效率,用 Cython 寫完的代碼可以很容易轉(zhuǎn)成 C 語言代碼,然后又可以再編譯成動態(tài)鏈接庫(pyddll)供 Python 調(diào)用,所以 Cython 一般用來編寫 Python 的 C 擴(kuò)展,上面說的 Python 文件編譯生成 pyd 文件就是利用 Cython 來實現(xiàn)的 。Cython 的源代碼文件一般為pyx后綴。

總結(jié)

后綴名 作用
py 最常見的 Python 源代碼文件。
pyc 常見的 Python 字節(jié)碼緩存文件,可以反編譯成 py 文件。
pyo 另一種 Python 字節(jié)碼緩存文件,只存在于 Python2 及 Python3.5 之前的版本。
pyi Python 的存根文件,常用于 IDE 代碼格式檢查時的類型提示。
pyw 另一種 Python 源代碼文件,一般只存在于 Windows 系統(tǒng)。
pyd 一種 Python 可直接調(diào)用的 C 語言動態(tài)鏈接庫文件,一般只存在于 Windows 系統(tǒng)。
pyx Cython 源代碼文件,一般用來編寫 Python 的 C 擴(kuò)展。

到此這篇關(guān)于Python 相關(guān)文件常見的后綴名詳解的文章就介紹到這了,更多相關(guān)Python 文件后綴名內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python接口自動化淺析pymysql數(shù)據(jù)庫操作流程

    Python接口自動化淺析pymysql數(shù)據(jù)庫操作流程

    本文主要介紹pymysql安裝、操作流程、語法基礎(chǔ)及封裝操作數(shù)據(jù)庫類,需要的朋友可以參考下,希望能對大家有所幫助,每日提升一點點,歡迎大家多多交流討論
    2021-08-08
  • 解決python matplotlib imshow無法顯示的問題

    解決python matplotlib imshow無法顯示的問題

    今天小編就為大家分享一篇解決python matplotlib imshow無法顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python Coroutine池化的實現(xiàn)詳解

    Python Coroutine池化的實現(xiàn)詳解

    在當(dāng)今計算機(jī)科學(xué)和軟件工程的領(lǐng)域中,池化技術(shù)如線程池、連接池和對象池等已經(jīng)成為優(yōu)化資源利用率和提高軟件性能的重要工具,所以下面我們就來看看Coroutine池化的具體實現(xiàn)吧
    2024-01-01
  • tensorflow實現(xiàn)tensor中滿足某一條件的數(shù)值取出組成新的tensor

    tensorflow實現(xiàn)tensor中滿足某一條件的數(shù)值取出組成新的tensor

    今天小編就為大家分享一篇tensorflow實現(xiàn)tensor中滿足某一條件的數(shù)值取出組成新的tensor,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • tensorflow基于Anaconda環(huán)境搭建的方法步驟

    tensorflow基于Anaconda環(huán)境搭建的方法步驟

    本文主要介紹了tensorflow基于Anaconda環(huán)境搭建的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 新一代爬蟲利器Python?Playwright詳解

    新一代爬蟲利器Python?Playwright詳解

    這篇文章主要為大家介紹了新一代爬蟲利器Playwright,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • python開發(fā)環(huán)境PyScripter中文亂碼問題解決方案

    python開發(fā)環(huán)境PyScripter中文亂碼問題解決方案

    PyScripter是一個使用Delphi開發(fā)的開源的Python集成開發(fā)環(huán)境(IDE),PyScripter支持Python2.4、2.5、2.6、2.7、3.0、3.1、3.2,而且可以根據(jù)需要切換。
    2016-09-09
  • PyCharm搭建Spark開發(fā)環(huán)境實現(xiàn)第一個pyspark程序

    PyCharm搭建Spark開發(fā)環(huán)境實現(xiàn)第一個pyspark程序

    這篇文章主要介紹了PyCharm搭建Spark開發(fā)環(huán)境實現(xiàn)第一個pyspark程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • caffe的python接口繪制loss和accuracy曲線

    caffe的python接口繪制loss和accuracy曲線

    這篇文章主要為大家介紹了caffe的python接口繪制loss和accuracy曲線示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python腳本實現(xiàn)自動替換文件指定內(nèi)容

    Python腳本實現(xiàn)自動替換文件指定內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何編寫一個py腳本,可以實現(xiàn)自定義替換py文件里面指定內(nèi)容,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03

最新評論

南江县| 淳化县| 嘉义市| 苗栗市| 巫溪县| 蓝田县| 上杭县| 陕西省| 固原市| 铜陵市| 永济市| 河津市| 称多县| 赤城县| 利津县| 华宁县| 万全县| 克山县| 莆田市| 西贡区| 迁西县| 安塞县| 定西市| 新营市| 延津县| 延长县| 都昌县| 抚州市| 苍南县| 汪清县| 晋城| 天峨县| 瓮安县| 会泽县| 徐汇区| 洮南市| 定西市| 濉溪县| 宜川县| 乌兰察布市| 广丰县|