1. .py 文件
作用:标准的Python源代码文件。
特点:
由纯文本编写,包含Python代码(函数、类、变量等)。
可直接被Python解释器执行(如 python script.py)。
是开发中最常用的文件类型。
示例:
# hello.py
def greet():
print("Hello, Python!")
if __name__ == "__main__":
greet()
2. .pyc 文件
作用:Python编译后的字节码文件(缓存文件)。
特点:
生成方式:当Python执行.py文件时,解释器会先将其编译为字节码(.pyc),再由Python虚拟机(PVM)执行。
存储位置:
Python 3.2+:默认存储在 __pycache__ 目录下,文件名格式为 模块名.cpython-版本号.pyc(如 hello.cpython-38.pyc)。
旧版本:直接与.py文件同目录。
目的:加速程序启动(避免重复编译)。
删除影响:无影响,下次运行会重新生成。
示例:
# 执行 hello.py 后生成 __pycache__/hello.cpython-38.pyc
python hello.py
3. .pyo 文件
作用:优化后的字节码文件(已废弃)。
特点:
生成方式:通过 python -O 或 python -OO 命令运行.py文件时生成(-O 表示优化,-OO 会移除文档字符串)。
存储位置:与.pyc类似,但文件名可能包含 opt- 标记(如 hello.opt-1.pyc)。
现状:Python 3.5+ 已废弃,优化功能合并到.pyc中。
示例:
# 生成优化后的字节码(旧版本行为)
python -O hello.py # 生成 hello.pyo 或优化后的 .pyc
4. .pyx 文件
作用:Cython编写的扩展模块源文件。
特点:
用途:用于编写高性能的Python扩展模块,支持C语言特性(如类型声明、指针)。
编译流程:
编写.pyx文件(混合Python和C语法)。
通过Cython编译器生成.c文件。
用C编译器(如gcc)将.c编译为共享库(如.so或.pyd)。
优势:比纯Python代码运行更快(接近C速度)。
示例:
cython
# hello.pyx
def greet():
print("Hello, Cython!")
编译命令:
# 安装Cython
pip install cython
# 生成扩展模块
cython hello.pyx --embed # 生成C代码
gcc -O3 -I /usr/include/python3.8 -o hello hello.c $(python3.8-config --ldflags)
5. .pyd 文件
作用:Windows平台上的Python扩展模块(动态链接库)。
特点:
本质:相当于Linux下的.so文件或macOS下的.dylib。
生成方式:
通过Cython编译.pyx文件生成。
或用C/C++编写扩展模块,通过Python C API编译。
用途:提供高性能功能(如数值计算、硬件交互)。
导入方式:像普通Python模块一样导入(如 import hello)。
示例:
// hello.c (Python C API示例)
#include <Python.h>
static PyObject* greet(PyObject* self, PyObject* args) {
printf("Hello, C Extension!\n");
Py_RETURN_NONE;
}
static PyMethodDef methods[] = {
{"greet", greet, METH_NOARGS, "Print a greeting."},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef module = {
PyModuleDef_HEAD_INIT, "hello", NULL, -1, methods
};
PyMODINIT_FUNC PyInit_hello(void) {
return PyModule_Create(&module);
}
编译命令:
# 生成 hello.pyd (Windows)
gcc -shared -o hello.pyd hello.c -I C:\Python38\include -L C:\Python38\libs -lpython38
总结对比表

常见问题
.pyc文件可以删除吗?
可以,Python下次运行时会重新生成。
如何禁止生成.pyc文件?
设置环境变量 PYTHONDONTWRITEBYTECODE=1,或运行命令时加 -B 选项(如 python -B script.py)。
.pyx和.pyd的关系?
.pyx是源文件,.pyd是编译后的Windows扩展模块(类似Linux的.so)。
如何保护Python代码?
使用.pyc(但易反编译)或编译为.pyd/.so(需结合代码混淆)。