qq_37112115 2024-03-30 21:56 采纳率: 100%
浏览 9
已结题

在pip.ini文件中,如果在[global]中设置多个镜像,镜像间存在优先级吗?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-30 21:56
    关注

    引自免费微信小程序:皆我百晓生

    在Python的pip.ini文件中,全局配置文件是用来定义不同软件包管理器(如Homebrew、Virtualenv、conda等)之间的依赖关系和安装顺序的配置文件。在这些配置文件中,没有直接的规定关于优先级的高低。

    通常,我们使用conda install命令进行包的管理时,它会根据一系列规则来进行安装决策。首先,对于相同版本的依赖项,conda会选择优先安装那些最新的依赖项。其次,如果满足特定条件(如某个依赖项需要特定的Python环境或库),conda还会考虑创建一个虚拟环境,并在其内部安装所需的依赖项。然而,这种情况下的优先级默认为较低,因为conda主要的目标是提供稳定的、易于使用的包管理工具,而不是为了确保某个特定依赖项的最新状态而设置特殊的安装优先级。

    如果你需要按照特定的依赖顺序(例如,保证PyTorch的最新版本总是放在先头)来管理不同的镜像,你需要通过在每个镜像所在的路径中添加-e参数来指定pip应该优先下载哪些依赖项:

    # 替换当前目录下的pip.ini文件中的旧路径
    pip_path = /path/to/old/pip.ini
    
    # 创建一个新的pip.ini文件并修改其内容,将旧的依赖列表替换为新的列表
    new_pip.ini = """
    [global]
    index-url = https://pypi.org/simple/
    dependencies = ...
    [torch]
    version = 1.9.2 torchvision==0.7.2 torchvision-nightly torchvision-isolates=0.5
    """
    
    # 将新的pip.ini文件保存回原始位置
    mv new_pip.ini ~/.pip/pip.ini
    

    然后,当你运行pip install -r new_pip.ini命令时,conda会按照新配置中的顺序自动下载和安装所需的所有依赖项:

    $ pip install -r new_pip.ini
    

    注意,上述代码示例并没有在全局环境中进行优先级排序,而是仅针对某一镜像路径进行了更改。如果需要在全局范围内按照依赖优先级进行操作,你应该在相应路径中添加--index-url--extra-index-url参数,以便conda能够正确地查找并下载来自各个源的镜像:

    # 替换当前目录下的pip.ini文件中的旧路径
    pip_index_url = "https://pypi.org/simple"
    pip_extra_index_url = "/path/to/other/source"
    
    # 将新的pip.ini文件保存回原始位置
    mv new_pip.ini ~/.pip/pip.ini
    

    最后,当你在命令行中引用Python包的名字(例如,torch)并显示对应的版本号时,torch仍然会按照原来的依赖优先级从高到低来查找和安装:

    python -m torch --version
    

    需要注意的是,Python的pip模块并不支持以线性依赖方式管理软件包的依赖关系,这通常是通过其他Python包管理器(如Conda或YAML)实现的。在pip中,所有的依赖都是通过链接(filelink)方式分配给Python解释器的,而依赖关系则由包管理器的配置文件或策略决定。在上面的示例中,由于conda的特殊需求(即安装PyTorch版本高于默认值),Python解释器会在默认的基础上提高发现和安装最新版本的PyTorch所需的优先级。但是,实际上,在大多数情况下,只要保持更新了conda源并设置了正确的依赖关系,Python解释器就会按照原定顺序安装所有相关的包。因此,无论是在全局配置还是通过pip与conda交互时,都无需过于关注这些额外的依赖顺序和优先级设置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 创建了问题 3月30日