Pip & uv 使用¶
约 592 个字 18 行代码 1 张图片 预计阅读时间 3 分钟
Pip 基础使用¶
- 从 PyPI 下载合适的版本(一般是最新,如果没有 requirement)
- 优先使用 wheel 构建,如果没有本地编译
- pip 会创建一个临时隔离环境
- 只安装 pyproject.toml 里声明的 build-system.requires
- 当前环境的 torch / numpy / cuda 都不可见
Pip 相关选项¶
- --no-build-isolation:构建时直接用当前环境里的包
- --no-use-pep517:不用 PEP 517 新构建系统,走 setup.py install
- --no-deps:只安装这个包,但是相关依赖不安装
- --no-cache-dir:不用本地缓存
- --no-binary:强制源码编译;--only-binary :all:: 只允许有源码
- -i / --index-url:指定 PyPI 镜像
Editable 与正常安装区别¶
发生的事情:
- 构建一个 wheel
- 把二进制的 wheel 拷贝到.venv/lib/python3.x/site-packages/tinyllm/
- 之后改本地源码,不会生效
发生的事情:
- 不拷贝源码
- 在 site-packages 里创建一个 指向源码目录的链接/映射
- 改本地源码,立刻生效
旧时代(setuptools legacy)
- 生成 .egg-link
- easy-install.pth 把源码路径加进 sys.path
现代(PEP 660)
- build backend 支持 editable 安装
- 返回一个可编辑 wheel
- 本质仍然是 路径引用,而不是复制
可以理解为:
uv 基础介绍¶
uv 是一个极快的 Python 包管理与虚拟环境工具,它 替代 pip + venv + pip-tools 的大部分工作
| pip 使用 | uv 里的对应 |
| ------------------ | ---------------- |
| pip install | uv pip install |
| python -m venv | uv venv |
| pip freeze | uv pip freeze |
| requirements.txt | uv sync |
| pip-tools | uv 内建 |
uv 优势¶
uv 缓存基于内容匹配¶
pip 的缓存问题
- 按 URL / 包名缓存
- 项目隔离
- wheel 经常重复构建
uv 的缓存设计
- 只要内容 hash 相同就可以全局复用
零拷贝安装¶
pip 安装 wheel 的传统方式
- 解压 whl
- 复制文件到 site-packages
- 写 metadata
存在大量:
- IO
- copy
- inode 分配
uv 的方式
大致顺序是:
1. reflink(Copy-on-Write)
- 相比 hard link,reflink 的拷贝语义更安全
- 文件系统支持(btrfs / xfs / APFS)
- 零拷贝
- 几乎瞬时
2. hard link
- 同一文件系统
- inode 共享
- 几乎零成本
3. fast copy
- mmap / sendfile
- 并行复制
Reflink vs hard link¶
| 维度 | hard link | reflink |
|---|---|---|
| inode | 同一个 | 不同 |
| 数据块 | 共享 | 共享(写时分裂) |
| 修改文件 | 所有链接都变 | 只影响当前文件 |
| 是否是“拷贝语义” | ❌ | ✅ |
| 是否需要同一 FS | ✅ | ❌(部分 FS 可跨子卷) |
| 是否支持目录 | ❌ | ❌ |
| 支持文件系统 | 所有 Unix FS | 仅 CoW FS |
| 语义安全性 | ⚠️ | ✅ |