Python各文件类型对比: .py、.ipynb、.pyi、.pyc、.pyd

本文介绍了Python中的几种常见文件类型:.py(源代码)、.ipynb(JupyterNotebook交互式文件)、.pyi(类型提示文件)、.pyc(编译文件提高执行速度)和.pyd(动态链接库文件实现跨进程共享)。
部署运行你感兴趣的模型镜像

在Python中,各文件类型的作用如下:

.py文件:是Python代码文件的标准扩展名,其中包含可执行的Python代码。

.ipynb文件:是Jupyter Notebook的文件扩展名,其中包含交互式代码、文本、图像、公式等多种元素,并且可以直接在浏览器中运行。

.pyi文件:是Python类型提示文件的标准扩展名,用于提供Python代码中的类型信息,便于IDE或文本编辑器等工具提供代码补全、错误检查等功能。

.pyc文件:是Python编译文件的标准扩展名,其中包含已编译的Python字节码文件,可以提高Python代码的执行速度。

.pyd文件:是Windows平台上的Python动态链接库文件扩展名,其中包含已编译的Python代码,并且可以在不同的Python进程中共享使用。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

感谢你提供的关键补充信息,现在问题的核心已经非常清晰了: --- ## 🔥 核心真相: > **你的 `__init__.py` 文件在打包时被编译成了 `.pyd`(Windows)或 `.so`(Linux/macOS)二进制文件!** 这是导致 PyCharm 出现 `binary skeletons` 和 “Unresolved reference” 报错的根本原因。 --- ### 🧨 为什么 `__init__.py` 会变成 `.pyd`? 这说明你在打包过程中使用了某种 **将 Python 脚本编译为原生扩展模块的工具**,例如: - [`Cython`](https://cython.org/)(最常见) - [`nuitka`](https://nuitka.net/) - [`pyarmor`](https://pyarmor.dashingsoft.com/) - 或自定义 distutils 命令 当你对 `__init__.py` 使用 Cython 编译后: ```bash __init__.py → __init__.c → __init__.pyd ``` Python 运行时仍然可以导入它 ✅ 但 PyCharm 的静态分析器 ❌ **无法读取其内容结构**(看不到函数、类、变量定义) ➡️ 结果就是: - 模块显示在 `External Libraries → binary skeletons` - 所有从该模块导入的内容都提示 “Cannot find reference” - 但运行正常(因为解释器能执行 `.pyd`) --- ## 📌 具体分析你的补充点 | 补充 | 分析 | |------|------| | 1. `__init__.py` 打包成 `.pyd` | ❗ 是根本问题!IDE 无法解析二进制 `__init__` 中的符号 | | 2. 动态导入 `from ._soa_auth import FastApiSoaAuth` | 如果 `_soa_auth.pyd` 也是编译过的,PyCharm 更难追踪 | | 3. `%USERPROFILE%\.cache\JetBrains\PyCharm*` 报错 | Windows 下路径语法错误,应使用 `del /s /q "%USERPROFILE%\.cache\JetBrains\PyCharm*"` 或手动删除 | | 4. 使用写死的 `packages=[...]` | 不是问题,只要结构正确即可 | | 5. site-packages 完整 | ✅ 安装没问题,运行没问题 | --- ## ✅ 正确解决方案(三种选择) ### ✅ 方案一:【推荐】不要编译 `__init__.py` 成 `.pyd` > 即使你要加密/保护代码,也不要编译 `__init__.py` —— 它是模块结构的“门面”。 #### 修改构建逻辑(以 Cython 为例): ```python # setup.py from setuptools import setup, Extension from Cython.Build import cythonize import os # 只编译非 __init__.py.py 文件 def get_extensions(): extensions = [] for root, dirs, files in os.walk("my_package"): for file in files: if file.endswith(".py") and file != "__init__.py": module_path = os.path.join(root, file) module_name = ( os.path.relpath(module_path, ".") .replace(os.sep, ".")[:-3] ) extensions.append(Extension(module_name, [module_path])) return extensions setup( name="my_package", version="0.1.0", packages=["my_package", "my_package.subpkg"], ext_modules=cythonize(get_extensions(), compiler_directives={"language_level": "3"}), ) ``` 📌 结果: - `my_package/__init__.py` → 保持 `.py` 文本格式 ✅ - `my_package/core.py` → 编译为 `core.pyd` ❗ - PyCharm 能看到 `__init__.py` 中的 `from ._soa_auth import FastApiSoaAuth` - 自动补全和导入不再报错! --- ### ✅ 方案二:为编译模块提供 `.pyi` 类型存根文件(Stubs) 如果你**必须**把所有 `.py` 都编译成 `.pyd`,那么你需要为每个模块创建 `.pyi` 存根文件,告诉 IDE 接口长什么样。 #### 示例:`my_package/__init__.pyi` ```python from my_package._soa_auth import FastApiSoaAuth __all__ = ['FastApiSoaAuth'] ``` #### `my_package/_soa_auth.pyi` ```python class FastApiSoaAuth: def __init__(self, ...): ... def authenticate(self, ...) -> bool: ... ``` 然后在 `setup.py` 中确保这些 `.pyi` 文件也被安装: ```python package_data={ "my_package": ["*.pyi"], }, include_package_data=True, ``` ✅ 效果:PyCharm 将读取 `.pyi` 文件进行类型推断,消除红色波浪线。 --- ### ✅ 方案三:完全避免使用二进制模块(仅适用于调试阶段) 如果你只是想隐藏源码而非极致性能,考虑以下替代方案: | 方法 | 是否防逆向 | 是否影响 PyCharm | |------|-----------|----------------| | `.pyc` 编译(`compileall`) | 弱 | ✅ 可识别 | | 代码混淆(如 `pyarmor`) | 中等 | ⚠️ 有时干扰 | | 不发布源码 + `.pyc` | 中 | ✅ 多数 IDE 支持 | | 使用私有服务器 + 认证访问 | 强 | ✅ 最佳实践 | > 💡 建议:对于内部系统,优先通过 **网络权限控制** 而非技术手段加密代码。 --- ## 🛠️ 清除缓存的正确命令(Windows) ```cmd :: 关闭 PyCharm 后执行 rmdir /s /q "%USERPROFILE%\.cache\JetBrains\PyCharm*" ``` 或者用 PowerShell: ```powershell Remove-Item -Recurse -Force "$env:USERPROFILE\.cache\JetBrains\PyCharm*" ``` 然后再重启 PyCharm 并重新打开项目。 --- ## ✅ 总结与建议 | 问题 | 解法 | |------|------| | `__init__.py` 被编译成 `.pyd` 导致 PyCharm 报错 | ❌ 禁止编译 `__init__.py` | | 动态导入无法识别 | ✅ 提供 `.pyi` 存根文件 | | binary skeletons 显示异常 | ✅ 让 `__init__.py` 保留为文本 | | 缓存清除失败 | ✅ 使用管理员权限运行命令或手动删除 | --- ### ✅ 最终推荐做法(安全又兼容 IDE) ```text my_package/ ├── __init__.py ← 保留为 .py(不要编译!) ├── _soa_auth.py ← 可编译为 _soa_auth.pyd ├── _soa_auth.pyi ← 添加存根文件(可选但推荐) └── utils.py ← 可编译 ``` 这样既能保护核心逻辑,又能保证 PyCharm 正常工作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逃逸的卡路里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值