离线安装测试第一步是禁用pypi、仅从本地wheel目录安装:用pip install --find-links ./wheels/ --no-index --upgrade your-package-name,确保不联网补依赖。

用 pip install --find-links 指向本地 wheel 目录安装
离线包测试的第一步不是直接 pip install xxx.whl,而是模拟真实离线环境:禁用 PyPI、只从本地目录找包。否则 pip 可能悄悄联网补依赖,掩盖问题。
实操建议:
- 把构建好的
.whl文件统一放到一个空目录,比如./wheels/ - 确保该目录下还包含所有依赖的 wheel(包括间接依赖),可用
pip wheel --no-deps --wheel-dir ./wheels/ .和pip wheel --no-cache-dir --wheel-dir ./wheels/ -r requirements.txt预先收全 - 运行:
pip install --find-links ./wheels/ --no-index --upgrade your-package-name
-
--no-index是关键,它强制 pip 不查 PyPI;--find-links告诉它去哪找本地 wheel
在干净虚拟环境中验证 import 和基础功能
装完不等于能用。很多 wheel 包在构建时漏了 package_data 或 MANIFEST.in,导致 import 时缺模块、缺配置文件或资源路径报错。
实操建议:
- 每次测试都新建隔离环境:
python -m venv ./test_venv && source ./test_venv/bin/activate
(Windows 用.\test_venv\Scripts\activate) - 安装后立刻试 import:
python -c "import your_package; print(your_package.__version__)"
- 如果包带 CLI,跑一次
your-command --help;如果含数据文件,检查pkg_resources.files('your_package').joinpath('data/config.json')是否可读
检查 wheel 元数据和文件结构是否完整
常见错误是 setup.py 里没声明 include_package_data=True,或 MANIFEST.in 漏写了 *.json、templates/**,结果 wheel 解压后缺文件,但本地开发时因源码在身边完全感知不到。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
实操建议:
- 用
tar -tf your_package-1.0.0-py3-none-any.whl看实际打包了哪些文件(wheel 是 zip 格式) - 重点核对:
your_package/__init__.py、your_package/data/、your_package/py.typed(如需类型提示)是否存在 - 用
python -m wheel unpack your_package-1.0.0-py3-none-any.whl解包后人工浏览目录结构 - 运行
python -m twine check your_package-1.0.0-py3-none-any.whl验证元数据合规性(会提示 description 格式、classifiers 缺失等)
模拟无网络 + 无缓存的 CI 式安装流程
本地开发时 pip 默认用缓存、可能复用已装依赖,但生产离线环境往往连缓存都没有,且依赖必须全部预置。不模拟这个,上线就炸。
实操建议:
- 临时清空 pip 缓存:
pip cache purge
- 禁用所有远程源:
pip install --find-links ./wheels/ --no-index --no-cache-dir --force-reinstall your-package-name
- 加
--force-reinstall确保重走全流程,不跳过任何步骤 - 如果依赖有 C 扩展(如
numpy),确认 wheel 名称含manylinux或匹配目标系统架构,否则ERROR: No matching distribution会静默失败
最容易被忽略的是依赖的 wheel 是否真的“全量离线”——比如你打包了 requests,但它依赖的 charset-normalizer 没放进 ./wheels/,--no-index 下就会直接报错退出,根本不会提醒你缺哪个包。建议用 pipdeptree --packages your-package-name --warn silence 提前导出依赖树,再逐个核对 wheel 是否存在。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










