從.py到.pyd帶你深入了解Python文件類型
最近有了[AI編程],Python的熱度降低了,我也終于有時間關(guān)注一直感興趣的Python話題,而不是回答Python怎么安裝這種入門問題了。
我對于Python興趣的探索,主要基于兩本書:《流暢的Python》、《Python高性能編程》。越深入了解Python高級語法,越能深入理解這門語言設(shè)計的精妙之處。
今天我們來聊聊Python世界中那些形形色色的文件類型。
作為一個Python開發(fā)者,你肯定經(jīng)常跟.py文件打交道。但Python生態(tài)中其實還有很多其他重要的文件類型,每種都有其獨特的用途。
Python核心文件類型
| 文件類型 | 主要用途 | 是否可讀 | 生成方式 |
|---|---|---|---|
| .py | Python源代碼 | 是 | 手動創(chuàng)建 |
| .pyc | 編譯后的字節(jié)碼 | 否 | Python自動生成 |
| .pyo | 優(yōu)化后的字節(jié)碼 | 否 | Python帶-O參數(shù)生成 |
| .pyd | Windows動態(tài)鏈接庫 | 否 | Cython/C擴(kuò)展編譯 |
| .so | Linux/Mac動態(tài)庫 | 否 | Cython/C擴(kuò)展編譯 |
| .pyw | 無控制臺Python腳本 | 是 | 手動創(chuàng)建 |
| .pyx | Cython源代碼 | 是 | 手動創(chuàng)建 |
有一些文件類型你可能沒見過,有2種原因:
- 你沒有這么復(fù)雜的工作場景,例如so文件的使用
- 部分類型被編輯器給自動屏蔽了,例如:pyc文件
詳細(xì)解析
1. .py - Python源代碼文件
這是最常見的Python文件,包含人類可讀的Python代碼。
# hello.py
def greet(name):
return f"Hello, {name}!"
if __name__ == "__main__":
print(greet("Python開發(fā)者: 程序員晚楓"))
2. .pyc - 編譯字節(jié)碼文件
Python解釋器將.py文件編譯成字節(jié)碼,加速后續(xù)執(zhí)行。
生成方式:
# Python會自動在__pycache__目錄生成.pyc文件 python -m py_compile hello.py
文件結(jié)構(gòu):
- 位于
__pycache__目錄 - 命名格式:
hello.cpython-39.pyc - 包含Python字節(jié)碼,不是機(jī)器碼
3. .pyd - Windows動態(tài)鏈接庫
.pyd文件本質(zhì)上是DLL文件,但可以被Python直接導(dǎo)入。
這種類型,可以理解為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("程序員晚楓"))
4. .pyx - Cython源代碼文件
Cython是Python的超集,允許編寫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 - 無控制臺腳本
在Windows上,.pyw文件運行時不會顯示控制臺窗口,適合GUI應(yīng)用。
# my_app.pyw
import tkinter as tk
root = tk.Tk()
root.title("無控制臺應(yīng)用")
root.mainloop()
包與分發(fā)文件
包相關(guān)文件
| 文件類型 | 用途 |
|---|---|
| init.py | 包初始化文件(Python 3.3+可選) |
| main.py | 包作為腳本執(zhí)行時的入口 |
分發(fā)與安裝
| 文件類型 | 用途 |
|---|---|
| .whl | Python包的分發(fā)格式(wheel) |
| .egg | 舊版包分發(fā)格式 |
| setup.py | 包安裝腳本 |
| setup.cfg | 包配置 |
| pyproject.toml | 現(xiàn)代包配置 |
| requirements.txt | 依賴列表 |
配置文件類型
項目配置
# pyproject.toml(現(xiàn)代Python項目) [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)境與工具配置
| 文件類型 | 用途 |
|---|---|
| .python-version | pyenv版本文件 |
| Pipfile | pipenv依賴管理 |
| Pipfile.lock | 依賴鎖文件 |
| environment.yml | conda環(huán)境配置 |
特殊用途文件
1. .pyi - 存根文件
用于類型提示,不包含實現(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)用
包含所有依賴的zip應(yīng)用。
# 創(chuàng)建.pyz文件 python -m zipapp my_app -o app.pyz # 運行 python app.pyz
開發(fā)工具文件
測試相關(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ì)量
| 文件類型 | 用途 |
|---|---|
| .pylintrc | Pylint配置 |
| .flake8 | Flake8配置 |
| .coveragerc | 測試覆蓋率配置 |
| .pre-commit-config.yaml | Git鉤子配置 |
實際項目示例
一個典型的Python項目結(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
實用技巧
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)建專業(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',
],
},
)
性能對比:.py vs .pyd
在某些場景下,編譯成.pyd可以顯著提升性能:
# 性能測試示例
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
# 測試性能
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ā),每種文件類型都有其特定用途:
- 開發(fā)階段:主要使用
.py、.pyx - 運行階段:涉及
.pyc、.pyd、.so - 分發(fā)階段:使用
.whl、.egg - 配置管理:各種配置文件
掌握這些文件類型的特點和用途,能夠幫助你更好地組織項目、優(yōu)化性能和管理依賴。
到此這篇關(guān)于從.py到.pyd帶你深入了解Python文件類型的文章就介紹到這了,更多相關(guān)Python文件類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch 實現(xiàn)刪除tensor中的指定行列
今天小編就為大家分享一篇pytorch 實現(xiàn)刪除tensor中的指定行列,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Django使用celery異步發(fā)送短信驗證碼代碼示例
這篇文章主要介紹了Django中如何使用celery異步發(fā)送短信驗證碼的代碼示例,有需要的朋友可以借鑒參考下,希望可以對大家有所幫助2021-09-09
python使用Faker進(jìn)行隨機(jī)數(shù)據(jù)生成
大家好,本篇文章主要講的是python使用Faker進(jìn)行隨機(jī)數(shù)據(jù)生成,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2022-02-02

