pip 使用指南
About 1124 wordsAbout 4 min
2025-02-24
Pip:如何解析包,如何与conda配合
常用指令
pip install [package]:安装包- Args:
-e [path]:安装一个包的可编辑版本-r [file]:从文件安装包--no-deps [package]:安装包时不安装依赖-i [repo]:从指定的仓库安装包--upgrade-strategy only-if-needed:仅在需要时升级包
- Args:
pip install --upgrade [package]:更新包pip uninstall [package]:卸载包pip list:列出所有包pip show [package]:显示包的详细信息,以及依赖pip search [package]:搜索包
关于(requirements.txt)[https://zhuanlan.zhihu.com/p/663837782]
换源
上海交大源,距离集群最近,速度最快。
pip config set global.index-url https://mirror.sjtu.edu.cn/pypi/web/simple或者创建或编辑 ~/.config/pip/pip.conf 文件,加入或修改 index-url 相关段落为:
[global]
index-url = https://mirror.sjtu.edu.cn/pypi/web/simple
format = columns更多配置详见Configuring pip
Pip 与 Conda 混用
Ref 1. Bilibili: Pip与Conda到底能混用吗?
Ref 2. Anaconda: Using pip in a conda environment
以下内容部分引用自上述链接。
理论上二者不能掺杂使用。 在conda环境中使用pip安装包时,conda并不会察觉到 这些变更,并存在破坏环境的风险。一个可靠的方法是创建一个新的环境,并先通过conda 安装需要的包,再运行pip。再次强调,主要问题是pip的“状态性(或关联性)”——安装包的 顺序会关联更多的状态,这将使事情更难以正常工作。
从PyPI构建conda包 如果需要conda没有提供的软件包,可以使用
conda build来 创建,在pypi上的项目,使用conda skeleton可以生成一个用来创建conda包的配 方,几乎无需手动修改。使用conda后再使用pip 如果有大量只在PyPI上的包,在这种情况下,最安全的做法 是先通过conda安装所有包,然后再使用pip安装那些conda没有的包。应该使用
--upgrade-strategy only-if-needed来避免pip升级 已经安装的包。不要在base中使用pip 如果预计某项目需要混用conda与pip,最好的做法是将此安 装放入一个专门的conda环境中,以保护其他环境免受pip可能会进行的任何修改,因为 conda环境是独立 的,允许不同 版本的包存在。
在conda环境中,尽可能使用硬链接而不是复制文件。 如果安装了相同的一组包, 每个新的conda环境将只需要少量额外的磁盘空间。许多用户依赖于由安装Anaconda或 Miniconda创建的“base” conda环境,如果这个环境混杂着pip和conda安装的包,将会更难 恢复。另一方面,创建单独的conda环境允许随时整个删除和重新创建环境,而不会影响核 心的conda功能
Pip 解析环境的过程
20.3+:pip 的依赖解析器支持回溯。
在解析依赖时,pip 需要先假设要安装的软件包版本,然后再验证这些假设是否正确。如果 发现某个假设是错误的,就需要回溯(backtrack),也就是撤回部分已经完成的工作,重 新选择另一条安装路径。
这就是为什么 pip 可能会多次下载同一个软件包的不同版本,因为每次下载都会明确展示 给用户。回溯并不是 bug 或异常情况,而是 Python 依赖解析的正常工作方式。
示例
用户运行 pip install tea,而 tea 依赖于 hot-water、spoon 和 cup 等多个 软件包。
pip 先选择 tea 的最新版本,并获取它的依赖列表。然后,它会按照这个依赖关系,选 择 spoon 和 cup 的最新版本。但如果发现 cup 的这个版本和 spoon 的版本不兼 容,就会回溯,换一个 cup 版本再试。如果换成功了,pip 会继续处理下一个依赖(比 如 sugar);如果还是不行,就会继续回溯,直到找到所有依赖项都兼容的组合。
减少回溯,解决依赖冲突
- 限制软件包的版本范围,或使用constraints文 件
- 修改requirements.txt文件,去除无用或过时的依赖,放松对依赖的版本要求
- 使用
--upgrade-strategy only-if-needed参数,仅在需要时升级包