可编辑模式下的Pip安装始终卸载现有分发



有人知道为什么无论是否使用--ignore installed选项,在可编辑模式下安装包都会导致现有分发版的卸载吗?

# Successfully install new package without uninstalling existing distribution
> pip install --prefix /tmp/test --ignore-installed .
# Always attempt to uninstall existing distribution
> pip install --prefix /tmp/test --ignore-installed -e .

从代码来看,这似乎是一种经过设计的行为:https://github.com/pypa/pip/blob/b98cf9c6c86567e5a9694083d663f031fee22dc0/src/pip/_internal/req/req_install.py#L449

编辑:

我完全理解Python包只能从一个地方导入,使用pip在site packages文件夹之外安装包可能会导致问题,但我认为使用--ignore installed和--prefix的人知道他们在做什么,并意识到风险。

那么,为什么可以在站点软件包文件夹之外安装Python软件包,而不删除已安装的分发版,但不适用于可编辑软件包呢?

这可能是您应该直接询问pip的维护人员的问题。


如果你想让我猜(我的头顶,没有尝试(这里是:

这可能与可编辑安装的实现方式有关。简而言之,它们依赖于.pth文件。很可能这些设备的优先级低于正常安装。我想我记得看到那些.pth文件的路径被放在sys.path的后面。

因此,如果在单个环境中,普通site-packages目录和.pth文件指向的目录中都有顶级包something,那么它将始终是首先找到并导入的site-packages中的包。为了弥补这一点,可能决定在指定--editable时始终卸载以前的安装(只是猜测,我不知道(。

另一方面,使用--ignore-installed只会覆盖site-packages中已经存在的something目录(我想,我还没有测试过它(。因此,最近安装的版本是可导入的(而以前安装的版本的一些残余部分仍然可以导入,如果存在的话(。

导入特定包时,它只能从一个地方加载,即系统上的一个目录。在";可编辑";(-e(安装,这是通过将包的链接放在python发行版的某个地方来实现的——很可能是放在以前不可编辑版本的同一个地方。为了确保这不会发生冲突,并确保导入得到您最近指定的内容,将删除以前的包。

如果你想做其他事情,你可以使用PYTHONPATH指向包含你的包的目录(在分发位置之前会搜索该目录(,或者制作你自己的链接;或者甚至在进行导入之前操纵CCD_ 13。

最新更新