uv与conda
说到conda与uv可能有些人会有些陌生其实conda和uv并不是什么高大上的概念简单地来说uv就是对venv和pip的高级封装 接下来我们将详细讨论它们的相关知识uvpip install的不利之处及最经典解决方案venv大家或许经常使用pip install来安装包但我们如果直接使用这个命令比如直接pip install flask的话我们安装的这个flask包会放入全局环境那么在实际开发中这就会直接或间接地导致版本问题直接的问题就是这个库可能在不同的项目中会使用不同的版本比如这个项目要flask3.11另一个项目要3.0间接的问题那就更麻烦了因为一个库可能依赖几个其他的库但库的版本不同被依赖库的版本也可能不同这样一层层嵌套下来就会引发更多的版本冲突导致依赖地狱为了解决这个问题我们引入了虚拟环境venvpython -m venv .venv推荐使用.venv因为主流ide如vscode、pycharm会自动识别这个名字当然严格地来说vscode并不算ide虚拟环境如何发挥作用虚拟环境起作用的方式修改python中的sys.path变量sys.path本身是一个列表里面记录了python在导入模块时需要搜索的一系列文件夹路径在执行import flask时python会严格地按照这个列表顺序搜索直到找到flask,当没有激活虚拟环境时sys.path指向的是全局目录激活虚拟环境后sys.path指向的是这个虚拟环境安装的包如flask就是存在虚拟环境中的pip依赖项相关问题为了让别人快速下载项目所需要的库我们需要列出依赖项如果使用的是pip命令的话那么就需要使用pip freeze一般使用重定向符pip freeze requirements.txt把它导入到一个叫做requirements.txt的新文件中。另外关于直接依赖和间接依赖pip freeze也会带来很多问题因为pip freeze命令无法分清什么是我们的直接依赖什么是间接依赖。比如pip install flask后项目中可能有很多的其他的间接依赖在文件中更麻烦的是pip uninstall flask也无法分清使用pip freeze requirements.txt重新生成requirements文件会发现那些间接依赖还在。现在的标准方案是使用pyproject.toml文件在这之前不同的开发工具通常有着独立的配置文件project.toml的dependencies列表让我们只需考虑直接依赖。但直接pip install pyproject.toml的话会把main.py也弄进虚拟环境中这在开发过程中就十分麻烦了因为我们修改main.py时它并不会同步到虚拟环境中解决方案是install时在后面加上-e参数这样的话就h会在虚拟环境中创建一个链接文件而不是直接存放最初的源代码pyproject.toml的劣势我们无法简单快捷地用一条类似于pip install flask的命令添加一个新的包过于麻烦还容易出错对于程序员这样的群体这种方式怎么可能会接受呢于是我们要寻求其他方案官方并没有提供这样的工具但社区为我们提供了uv正是一种十分具有代表性的方式。uv:千呼万唤始出来什么是uv呢我们可以将它理解为对pip、venv的高级封装事实上这些工具几乎都是如此它们在底层还是使用的pip、venv这些工具但为我们提供了一套更简单的接口。回顾一下前面的流程python -m venv .venv——source .venv/bin/activate——edit pyproject——pip install -e.python官方命令的麻烦我们已经花了不少笔墨来阐述了但如果使用uv的话那就相当简单了直接一句uv add flask就可以完成检查并创建虚拟环境修改pyproject下载flask和间接依赖。然后一句简单的uv sync,别人就可以直接创建虚拟环境并下载依赖。使用uv的话关于代码的运行可以和原来一样source .venv/bin/activate激活虚拟环境python main.py运行代码但我们还可以直接使用uv run main.py这样的话它可以直接找到对应的venv在虚拟环境的上下文中执行命令。全局缓存uv的虚拟环境采取的是全局环境这和python官方的虚拟环境采取的措施并不一样使用uv安装包时包会放在一个全局缓存目录下当你用uv创建虚拟环境使用相同的包时并不会重新下载一次而是使用一个链接指向缓存uv的具体命令和速度关于uv的其他具体命令本文就不再具体介绍了感兴趣的可以自行去查询官方文档。哦对了关于uv的性能我们也不得不提一嘴它真的非常快因为它是基于Rust编写的Conda大家在了解conda时可能会理不清各种名字为什么一个conda会有Anaconda Distribution、miniconda、miniforge、conda-forge各种各样的名词呢他们到底是什么意思代表了什么接下来让我们来好好地阐述一下。什么是conda首先到底什么是conda?Conda其实就是一个包管理器说到包管理器大家肯定会想到python官方的包管理器pip,那么conda和python官方的包管理器有什么区别呢但pip在2011就已经发布了而venv更是早在2008就发布了那么为什么在2012年又会搞出conda这一茬呢其实他们最初的面向群体是不一样的python语法简单加上matlab实在太贵了导致很多数学家和非计算机的科学家会选择python来处理相关任务但python实在太慢了所以出现了很多用其他语言比如c语言写的库比如numpy但麻烦的是当时的pip对这种跨语言依赖的支持做得非常非常糟糕因此就出现了conda。在最开始的时候conda不仅支持了python还支持了R语言而现在不仅是我们接下来要讲的Anaconda Distribution还是整个conda生态都更进一步几乎已经支持了所有主流的编程语言为了方便接下来的讲解我们还是以python为例。Anaconda Distribution接下来让我们先讲讲Anaconda Distribution吧Anaconda Distribution是Anaconda公司发布的软件包合集里面包含了常用的软件包(如numpy)和包管理工具conda。当然有时候我们会觉得不需要这么多的包加上Anaconda公司将大量的包托管在了anaconda.org命令上只需要conda命令下载就好了那么我们有没有一个只包含conda的包呢有的兄弟有的这就是接下来要讲的miniconda。minicondaminiconda也是Anaconda公司发布的不过里面只包含了conda因此更加地轻量相比Anaconda Distribution毫无疑问大部分人更愿意选择它。但其实无论是Anaconda Distribution还是miniconda,都存在一个问题那就是它下载包的default channels是付费的毕竟Anaconda终究是家商业公司不可能说花这么多精力纯赔钱那么有没有不付费的办法呢当然还是有的conda-forgeconda会从anaconda.org的default channels上下载数据但这是付费的不过Anaconda公司允许我们在上面自托管其他的东西因此就有了conda-forge,conda-forge由社区维护量大管饱还免费甚至更新速度快开源社区的力量依旧令人感叹。miniforge如果你使用前面提到的Anaconda Distribution和miniconda你可以使用-c参数来修改channnels但每次都要使用-c参数的话未免太麻烦了因此就有了miniforgeminiforge由社区重新将conda打包并将默认channel由付费的anaconda.org改为conda-forge,这样一来我们就不用每次修改channels了。另外minifoege不仅包含了修改过default channel的conda还包含了用cpp重写的一个conda叫做mamba。conda部分命令介绍创建虚拟环境conda create -n myenv python3.11激活虚拟环境conda activate myenv装包conda install numpy1.24.3指定channels:conda install -c conda-forge numpy将conda-forge修改为默认conda config --add channels conda-forge conda config --set channel_priority strict其他的此处就不阐述了