有人知道为什么无论是否使用--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。