C/C++教程

告别Anaconda?试试这些替代品吧

本文主要是介绍告别Anaconda?试试这些替代品吧,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

AI 创作的图像 (GPT-4 / DALL-E)

寻找 Conda 的替代品
背景信息

像许多在研究机构工作的 Python 用户一样,我最近得知 Anaconda 更新了许可政策,因为他们联系了我工作的非盈利研究机构。他们更新了许可政策,要求员工超过 200 人的非盈利机构不仅需要为每个安装完整 Anaconda 分发版的用户购买付费许可证,还要求那些从默认包仓库拉取包的用户也购买许可证。我一直使用 miniconda(本身是免费且开源的),但默认情况下它会从需要许可证的“defaults”通道拉取包。

我可以直接更新我的miniconda配置,使用社区支持且依然免费的‘conda-forge’仓库,或者切换到miniforge继续像以前一样工作,但我借此机会四处看看其他选项。Python 是一种免费且开源的语言;实际上,Python 社区创建了 Anaconda “默认” 仓库中的那些包,所以我为什么要为这些我没有付费的公司提供的免费软件付费呢?

注意: 如果您的组织决定阻止访问 repo.anaconda.com ,以防止员工使用“defaults”通道,那么需要注意的是,miniconda中的“base”环境里仍然会从“defaults”通道拉取包,因此你就不能再安装或更新miniconda了。

逛了一圈之后,我决定仔细看看这两个UV和Pixi。UV和Pixi与Conda有一个重要的不同之处。Conda会在一个中央注册表中创建环境,这些环境可以在任何地方激活和使用,而UV和Pixi则是以项目为中心,在你的项目文件夹中创建虚拟环境。

UV

(紫外线)

我首先看的是这个替代方案 UV,它自称是如下:

“一个极快的Python包安装工具,用Rust编写,并设计为pippip-tools工作流程的替代工具。”

Astral,开发了UV的公司同时也是Rye和Ruff的开发者。据我所知,Rye的功能似乎正在被集成到UV中,UV最终将使Rye变得多余。只需一条命令即可在所有常见平台上安装UV。

安装UV

在 Linux、MacOS 或 WSL(Windows Subsystem for Linux)上安装 UV 的命令如下:

运行以下命令来安装astral.sh的uv工具: curl -LsSf https://astral.sh/uv/install.sh | sh。

在 Windows 上安装 UV 的命令:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

运行此PowerShell命令以从astral.sh下载并安装脚本。

或者可以从Github直接下载安装包或二进制文件。

在 MacBook Pro 上装 UV 只用了几秒钟。

安装 UV 在 macOS 上

重启 shell 后,uv 命令就可以用了。

用UV来安装Python

与conda或miniconda不同,UV在安装过程中不会安装基础Python环境。要安装你想要安装的Python版本,请执行如下命令,并将【版本】替换为你想要安装的Python版本:

uv python 安装 <版本号>(例如:uv python install 3.7.4)

在这里我一眨眼的工夫就安装了Python 3.12。这快得令人难以置信,以至于基于我对conda的使用经验,我简直不敢相信。

安装 Python 3.12 和 UV

新建一个项目

要创建一个新项目,请使用 uv init 命令,这将在初始化新项目之前创建一个新的项目文件夹。你可以指定要使用的指定的Python版本。

    uv init -p 3.12 爸爸笑话

安装依赖项:

要为你的项目安装 Python 包依赖,切换到新项目目录并使用 uv add 命令。

    cd 爸爸笑话文件夹  
    uv 提交请求

下面是一个创建新的UV项目实例、设置虚拟环境(virtual environment)并安装依赖项(dependencies)的示例:

创建一个新的Python项目并引入依赖

上述示例的结果是如下的目录结构。它不仅创建了这些文件,还把项目初始化为一个 git 仓库。它创建了一个空的 README.md ,一个特定于 Python 的 .gitignore ,一个使用了指定 Python 版本的 Python 虚拟环境,依赖版本锁定文件(如 poetry 的 lock 文件),以及标准的 pyproject.toml 文件(例如 poetry 的配置文件)。

    爸爸笑话  
    ├── .git  
    ├── .gitignore  
    ├── .python-version  
    ├── .venv  
    ├── README.md  
    ├── dad-jokes.py  
    ├── pyproject.toml  
    └── uv.lock

你可能已经注意到常见的“requirements.txt”文件缺失。如果你打算与他人分享项目,可以通过以下命令轻松生成一个 requirements.txt 文件:

    uv pip compile pyproject.toml -o requirements.txt

创建 requirements.txt 文件的示例

为了您的项目创建一个requirements.txt文件

启动一个交互的Python环境

在项目中的虚拟环境中运行交互式Python shell,可以在项目目录中使用uv run python命令。

运行一下 Python

使用 UV 生成一个交互式的 Python 命令行

给项目加一个脚本

让我们写一个简单的Python脚本,来测试在这个由UV创建的虚拟环境中运行代码。我已经更新了‘dad-jokes.py’文件如下:

    import requests  

    def get_dad_joke():  
        url = "https://icanhazdadjoke.com/"  
        headers = {  
            "Accept": "application/json"  
        }  
        response = requests.get(url, headers=headers)  

        if response.status_code == 200:  
            joke = response.json().get('joke')  
            return joke  
        else:  
            return "没能获取到笑话。"  # 没能获取到笑话。  

    if __name__ == "__main__":  
        # 打印获取到的笑话
        print(get_dad_joke())

用 UV 运行脚本

要运行此脚本,您应该使用 uv run 命令,而不是直接运行 python <script-name>

运行 dad-jokes.py 脚本

一个新爸爸的笑话

用UV运行我们的脚本,搞到一个老爸笑话。

保存您的更改

由于 UV 在创建项目文件夹时将其初始化为 git 仓库,你现在可以提交更改并推送到 GitHub。

    git add .  
    git commit -m "第一次提交代码" # 这是第一次提交代码

总的来说,UV似乎是个很好的工具。它真的很快,不依赖于任何Anaconda包。UV所有的包都来自PyPI。

皮克斯

然后,我试用了Pixi,它特别适合Conda用户。

“Pixi 是一款多功能的开发工作流程工具,旨在简化项目依赖项、任务和环境的管理过程。Pixi 基于 Conda 生态系统构建,能够与 PyPI 生态系统无缝集成。”

值得一提的是,当使用 PyPI 的包时,Pixi 实际上使用 UV 作为包解析工具:https://prefix.dev/blog/uv_in_pixi。

值得注意的是,Pixi默认使用conda包并从免费的“conda-forge”通道获取这些包。如果你完全不想用Conda生态系统,Pixi可能不适合你的情况。

安装Pixi.js

在 Linux、MacOS 和 WSL (Windows Subsystem for Linux) 上安装 Pixi 的方法:请参考以下步骤。

    curl -fsSL https://pixi.sh/install.sh | bash

运行此命令以安装Pixi.sh

在 Windows 上安装 Pixi:

powershell -ExecutionPolicy ByPass -c "iwr -useb https://pixi.sh/install.ps1 | iex" # 运行此PowerShell命令来安装pixi.sh
# 注:iwr代表Invoke-WebRequest,iex代表Invoke-Expression

可以从GitHub直接下载安装包或二进制。

在我的 MacBook Pro 上安装 Pixi 比 UV 稍微慢一点,不过比 conda 快很多。

创建一个新项目

要创建一个新项目,你可以使用pixi init命令来创建。这将创建一个新的项目文件夹。你可以指定初始化新项目时使用的特定Python版本,新项目的名称可以是‘dad-jokes’。

    pixi init 爸爸冷笑话

安装依赖项:

要为你的项目安装Python包依赖,可以切换到新项目的目录下,并运行pixi add命令。与UV不同,使用Pixi的话,还需要将所需的Python版本添加为依赖项。

切换到dad-jokes目录  
cd dad-jokes  

添加Python版本为3.12  
pixi add python=3.12  

安装requests库  
pixi add requests

如下所示,创建一个新的Pixi项目实例,Python虚拟环境(venv),并为该脚本安装‘requests’模块:

创建一个新的Python项目并添加依赖。

如下所示的是该示例的目录结构。它比UV简洁得多,没有git仓库,也没有_README.md_或_pyproject.toml_文件。默认提供一个_pixi.toml_文件,而不是pyproject.toml

    dad 的笑话  
    ├── .gitattributes  
    ├── .gitignore  
    ├── .pixi  
    ├── pixi.lock  
    └── pixi.toml

你可以告诉它使用 pyproject.toml 风格的项目。这也会创建不同的文件夹布局,并设置为创建一个名为 dad-jokes 的包,其中包括一个空的 ‘init.py’ 文件在 'src'_ 文件夹下。

    pixi init dad-jokes --format pyproject # 初始化一个使用笑话主题的pixi项目,并指定使用pyproject格式

使用PyPI而不是conda-forge

正如我之前提到的,Pixi 会默认从 conda-forge 获取所有依赖项

检查 Pixi 是从哪里获取 conda 包文件的。

如果你想从PyPI安装一些包,可以在添加依赖项时使用_pypi_标志:

    pixi add --pypi black

这是一条用于将black库添加到Pixi项目中的命令。

从 PyPI 而不是从 conda-forge 安装软件包

如何生成requirements.txt文件?

我不明白如何创建一个标准的 requirements.txt 文件。甚至新建了一个项目并使用了 Pixi 生成的 pyproject.toml 文件,然后尝试使用 uv 的 ‘pip compile’ 命令(就像之前在 UV 部分提到的那样)并将该命令应用于 Pixi 生成的 pyproject.toml 文件,但并不奏效。或许我忽略了一些显而易见的事情?

启动一个Python的交互式环境

如果你想在你的 Pixi 项目中使用虚拟环境来运行一个交互式的 Python shell,可以这样做:在项目目录中运行 pixi shell 命令,然后输入 python

pixi shell(皮克西壳)
python(Python)

一个启动 Pixi shell 和交互式的 Python 命令行的示例:

在Pixi项目中启动Python shell

在 Pixi 上运行脚本啊

添加了之前用过的相同的‘dad-jokes.py’脚本后(爸爸式的笑话脚本),你可以通过使用pixi run python命令运行它。

    pixi run python 爸爸笑话脚本.py

用UV运行我们写的脚本,获取一个新的爸爸梗。

与UV不同,你需要使用git将你的项目初始化为git仓库,在提交和推送你的代码之前,如果这是你的计划。

总体来看,Pixi似乎也是一个不错的工具,用户体验和工作流程与UV几乎一样,而且支持conda包,如果你特别关心这一点的话。

总结

我认为UV和Pixi之间并没有明显的胜者,它们都是康达的快速、现代替代品,都同样值得信赖。两者都采用基于项目的重点方法,而不是康达使用的全局性的环境,这在项目之间提供了更好的依赖独立性,并且两者都更快。它们还避免了康达所必需的无用的“基础”环境。我认为这两种工具都非常适合有经验的用户,但对于刚开始学习Python的初学者来说,基于项目的这种方法可能会让他们感到有些困惑。

Pixi使用Conda包可能让安装某些包(如pytorch和cuda)更容易(这只是目前的推测),但我喜欢为那些使用不同于我工具链的人提供_requirements.txt_文件。可能有一种方法可以创建requirements.txt文件,但在短暂的寻找解决方案过程中,我没能弄明白。

UV完全不使用Conda包,因此更符合远离Anaconda的精神。它默认使用标准的_pyproject.toml_文件,我可以轻松生成_requirements.txt_文件。

所以,最后我决定真的试试UV。我说“试试”是因为我还没用它做过真正的项目,所以以后可能会遇到问题。Pixi也是一个不错的工具,将来我可能还会再用它。

这篇关于告别Anaconda?试试这些替代品吧的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!