不同扩展名的python文件有什么区别

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(需结合代码混淆)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容