從.py到.pyd帶你深入了解Python文件類(lèi)型
最近有了[AI編程],Python的熱度降低了,我也終于有時(shí)間關(guān)注一直感興趣的Python話題,而不是回答Python怎么安裝這種入門(mén)問(wèn)題了。
我對(duì)于Python興趣的探索,主要基于兩本書(shū):《流暢的Python》、《Python高性能編程》。越深入了解Python高級(jí)語(yǔ)法,越能深入理解這門(mén)語(yǔ)言設(shè)計(jì)的精妙之處。
今天我們來(lái)聊聊Python世界中那些形形色色的文件類(lèi)型。
作為一個(gè)Python開(kāi)發(fā)者,你肯定經(jīng)常跟.py文件打交道。但Python生態(tài)中其實(shí)還有很多其他重要的文件類(lèi)型,每種都有其獨(dú)特的用途。
Python核心文件類(lèi)型
| 文件類(lèi)型 | 主要用途 | 是否可讀 | 生成方式 |
|---|---|---|---|
| .py | Python源代碼 | 是 | 手動(dòng)創(chuàng)建 |
| .pyc | 編譯后的字節(jié)碼 | 否 | Python自動(dòng)生成 |
| .pyo | 優(yōu)化后的字節(jié)碼 | 否 | Python帶-O參數(shù)生成 |
| .pyd | Windows動(dòng)態(tài)鏈接庫(kù) | 否 | Cython/C擴(kuò)展編譯 |
| .so | Linux/Mac動(dòng)態(tài)庫(kù) | 否 | Cython/C擴(kuò)展編譯 |
| .pyw | 無(wú)控制臺(tái)Python腳本 | 是 | 手動(dòng)創(chuàng)建 |
| .pyx | Cython源代碼 | 是 | 手動(dòng)創(chuàng)建 |
有一些文件類(lèi)型你可能沒(méi)見(jiàn)過(guò),有2種原因:
- 你沒(méi)有這么復(fù)雜的工作場(chǎng)景,例如so文件的使用
- 部分類(lèi)型被編輯器給自動(dòng)屏蔽了,例如:pyc文件
詳細(xì)解析
1. .py - Python源代碼文件
這是最常見(jiàn)的Python文件,包含人類(lèi)可讀的Python代碼。
# hello.py
def greet(name):
return f"Hello, {name}!"
if __name__ == "__main__":
print(greet("Python開(kāi)發(fā)者: 程序員晚?xiàng)?))
2. .pyc - 編譯字節(jié)碼文件
Python解釋器將.py文件編譯成字節(jié)碼,加速后續(xù)執(zhí)行。
生成方式:
# Python會(huì)自動(dòng)在__pycache__目錄生成.pyc文件 python -m py_compile hello.py
文件結(jié)構(gòu):
- 位于
__pycache__目錄 - 命名格式:
hello.cpython-39.pyc - 包含Python字節(jié)碼,不是機(jī)器碼
3. .pyd - Windows動(dòng)態(tài)鏈接庫(kù)
.pyd文件本質(zhì)上是DLL文件,但可以被Python直接導(dǎo)入。
這種類(lèi)型,可以理解為java中的jar包格式,可以打包后給別人使用。
創(chuàng)建示例(使用Cython):
# 安裝Cython
pip install cython
# 創(chuàng)建Cython文件
# hello.pyx
def cython_greet(name):
return f"Hello from Cython, {name}!"
# setup.py
from setuptools import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("hello.pyx"))
# 編譯生成.pyd
python setup.py build_ext --inplace
使用.pyd文件:
# 像普通模塊一樣導(dǎo)入
import hello
print(hello.cython_greet("程序員晚?xiàng)?))
4. .pyx - Cython源代碼文件
Cython是Python的超集,允許編寫(xiě)C擴(kuò)展。
# fastmath.pyx
def fibonacci(int n):
cdef int i
cdef double a = 0.0, b = 1.0
for i in range(n):
a, b = b, a + b
return a
5. .pyw - 無(wú)控制臺(tái)腳本
在Windows上,.pyw文件運(yùn)行時(shí)不會(huì)顯示控制臺(tái)窗口,適合GUI應(yīng)用。
# my_app.pyw
import tkinter as tk
root = tk.Tk()
root.title("無(wú)控制臺(tái)應(yīng)用")
root.mainloop()
包與分發(fā)文件
包相關(guān)文件
| 文件類(lèi)型 | 用途 |
|---|---|
| init.py | 包初始化文件(Python 3.3+可選) |
| main.py | 包作為腳本執(zhí)行時(shí)的入口 |
分發(fā)與安裝
| 文件類(lèi)型 | 用途 |
|---|---|
| .whl | Python包的分發(fā)格式(wheel) |
| .egg | 舊版包分發(fā)格式 |
| setup.py | 包安裝腳本 |
| setup.cfg | 包配置 |
| pyproject.toml | 現(xiàn)代包配置 |
| requirements.txt | 依賴(lài)列表 |
配置文件類(lèi)型
項(xiàng)目配置
# pyproject.toml(現(xiàn)代Python項(xiàng)目) [build-system] requires = ["setuptools", "wheel"] [project] name = "my-project" version = "0.1.0" # setup.cfg(傳統(tǒng)配置) [metadata] name = my-project version = 0.1.0 # requirements.txt requests>=2.25.0 pandas>=1.3.0
環(huán)境與工具配置
| 文件類(lèi)型 | 用途 |
|---|---|
| .python-version | pyenv版本文件 |
| Pipfile | pipenv依賴(lài)管理 |
| Pipfile.lock | 依賴(lài)鎖文件 |
| environment.yml | conda環(huán)境配置 |
特殊用途文件
1. .pyi - 存根文件
用于類(lèi)型提示,不包含實(shí)現(xiàn)代碼。
# math.pyi def sqrt(x: float) -> float: ... def pow(x: float, y: float) -> float: ...
2. .pth - 路徑配置文件
在Python路徑中添加自定義路徑。
# my_paths.pth /home/user/my_python_libs ../relative/path/to/modules
3. .pyz - 自包含應(yīng)用
包含所有依賴(lài)的zip應(yīng)用。
# 創(chuàng)建.pyz文件 python -m zipapp my_app -o app.pyz # 運(yùn)行 python app.pyz
開(kāi)發(fā)工具文件
測(cè)試相關(guān)
# test_example.py
import pytest
def test_addition():
assert 1 + 1 == 2
# conftest.py(pytest配置)
import pytest
@pytest.fixture
def sample_data():
return {"key": "value"}
代碼質(zhì)量
| 文件類(lèi)型 | 用途 |
|---|---|
| .pylintrc | Pylint配置 |
| .flake8 | Flake8配置 |
| .coveragerc | 測(cè)試覆蓋率配置 |
| .pre-commit-config.yaml | Git鉤子配置 |
實(shí)際項(xiàng)目示例
一個(gè)典型的Python項(xiàng)目結(jié)構(gòu):
my_project/
├── src/
│ ├── __init__.py
│ ├── main.py
│ └── utils.py
├── tests/
│ ├── __init__.py
│ └── test_main.py
├── docs/
│ └── conf.py
├── .python-version
├── pyproject.toml
├── requirements.txt
├── setup.py
└── README.md
實(shí)用技巧
1. 查看.pyc文件內(nèi)容
python -m dis hello.pyc
2. 將Python包編譯成.pyd
# 使用Cython批量編譯
from Cython.Build import cythonize
from setuptools import setup, Extension
extensions = [
Extension("my_module", ["my_module.pyx"])
]
setup(ext_modules=cythonize(extensions))
3. 創(chuàng)建專(zhuān)業(yè)的分發(fā)包
# setup.py
from setuptools import setup, find_packages
setup(
name="my-package",
version="1.0.0",
packages=find_packages(),
install_requires=[
"requests>=2.25.0",
],
entry_points={
'console_scripts': [
'my-command=my_package.cli:main',
],
},
)
性能對(duì)比:.py vs .pyd
在某些場(chǎng)景下,編譯成.pyd可以顯著提升性能:
# 性能測(cè)試示例
import timeit
# Python版本
def python_fib(n):
if n <= 1:
return n
return python_fib(n-1) + python_fib(n-2)
# Cython編譯版本(假設(shè)已編譯為.pyd)
from cython_fib import cython_fib
# 測(cè)試性能
n = 35
python_time = timeit.timeit(lambda: python_fib(n), number=1)
cython_time = timeit.timeit(lambda: cython_fib(n), number=1)
print(f"Python: {python_time:.2f}s")
print(f"Cython: {cython_time:.2f}s")
print(f"加速比: {python_time/cython_time:.1f}x")
總結(jié)
Python的文件生態(tài)系統(tǒng)非常豐富,從源代碼到編譯文件,從配置到分發(fā),每種文件類(lèi)型都有其特定用途:
- 開(kāi)發(fā)階段:主要使用
.py、.pyx - 運(yùn)行階段:涉及
.pyc、.pyd、.so - 分發(fā)階段:使用
.whl、.egg - 配置管理:各種配置文件
掌握這些文件類(lèi)型的特點(diǎn)和用途,能夠幫助你更好地組織項(xiàng)目、優(yōu)化性能和管理依賴(lài)。
到此這篇關(guān)于從.py到.pyd帶你深入了解Python文件類(lèi)型的文章就介紹到這了,更多相關(guān)Python文件類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)遞歸遍歷文件夾并刪除文件
本文給大家匯總了3個(gè)Python實(shí)現(xiàn)遍歷文件夾并刪除的代碼,主要是給大家分享下這3種方法的實(shí)現(xiàn)思路,有需要的小伙伴可以參考下2016-04-04
Python文件簡(jiǎn)單操作及openpyxl操作excel文件詳解
這篇文章主要為大家詳細(xì)介紹了python對(duì)文件的簡(jiǎn)單使用及openpyxl操作excel文件的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-10-10
Python輕松實(shí)現(xiàn)PDF頁(yè)面的自動(dòng)化旋轉(zhuǎn)
本文將深入探討如何利用Python,通過(guò)一個(gè)功能豐富的庫(kù),輕松實(shí)現(xiàn)PDF頁(yè)面的自動(dòng)化旋轉(zhuǎn),讓你徹底告別手動(dòng)調(diào)整的繁瑣,大幅提升工作效率,希望對(duì)大家有所幫助2026-01-01
對(duì)Pandas DataFrame缺失值的查找與填充示例講解
今天小編就為大家分享一篇對(duì)Pandas DataFrame缺失值的查找與填充示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
解決ImportError:cannot import name ‘Flatten‘&nb
這篇文章主要介紹了解決ImportError:cannot import name ‘Flatten‘ from ‘torch.nn‘問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
python讀取與寫(xiě)入tif圖片的完整信息(過(guò)程詳解)
這篇文章主要介紹了python讀取與寫(xiě)入tif圖片的完整信息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
利用selenium爬蟲(chóng)抓取數(shù)據(jù)的基礎(chǔ)教程
這篇文章主要給大家介紹了關(guān)于如何利用selenium爬蟲(chóng)抓取數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用selenium具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

