Python 以可编辑模式安装Pip始终卸载现有分发版

Python 以可编辑模式安装Pip始终卸载现有分发版,python,installation,pip,Python,Installation,Pip,有人知道为什么在中安装软件包总是导致卸载现有发行版,而不管是否使用该选项吗 # Successfully install new package without uninstalling existing distribution > pip install --prefix /tmp/test --ignore-installed . # Always attempt to uninstall existing distribution > pip install --prefi

有人知道为什么在中安装软件包总是导致卸载现有发行版,而不管是否使用该选项吗

# 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 .
从代码上看,这似乎是一种精心设计的行为:

编辑:

我完全理解Python软件包只能从一个地方导入,并且使用pip在site packages文件夹之外安装软件包可能会导致问题,但我假设使用它的人知道他们在做什么,并且知道风险


那么,为什么可以在site packages文件夹之外安装Python软件包而不删除已安装的发行版,但对于可编辑的软件包则不可以?导入特定软件包时,只能从系统上的一个目录加载该软件包。在“可编辑的”(
-e
)安装的情况下,这是通过将指向包的链接放在python发行版中的某个位置来实现的,很可能放在与以前的不可编辑版本相同的位置。为确保不会发生冲突,并确保导入得到您最近指定的内容,将删除上一个包


如果您想做其他事情,可以使用PYTHONPATH指向包含您的包的目录(将在分发位置之前搜索该目录),或者创建您自己的链接;甚至在进行导入之前操纵
sys.path

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


如果你想让我猜(我的头顶,不用试一下),这里是:

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

因此,如果在单个环境中,在正常的
站点包
目录和
.pth
文件指向的目录中都有顶级包
某物
,那么首先找到并导入的总是
站点包
中的一个。为了解决这个问题,可能会决定在指定
--editable
时总是卸载以前的安装(只是猜测,我不知道)


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

但不可编辑的库也可能发生同样的冲突,不是吗?无论安装是一个链接还是一个包,使用
--ignore installed
意味着我知道不让pip检查冲突的风险,那么为什么在可编辑模式下会有这种特殊行为呢?谢谢你的回答。是的,当混合
.pth
文件和包时,我可以看出事情会变得多么糟糕。但在我的例子中,我只想使用pip以不同的前缀安装一个包,而不必担心当前的
站点包会被修改,而且感觉应该尊重
--ignore installed
选项。我刚刚提交了一个bug报告:。让我们看看进展如何1.我不知道该如何帮助他们。我读了错误报告也许我们可以退一步,重新考虑我们为什么要这么做?我们在此努力实现的更大目标是什么也可以先在可选的不同前缀下安装可编辑文件吗?--
--target
选项是否更有帮助为什么不创建一个
venv
?据我所知,
--target
仍然不能在可编辑模式下使用(),但即使它这样做了,它会发生什么变化?我的目标是使用pip在“隔离”位置安装软件包,而不改变现有发行版。这是我正在从事的项目:。你不认为,
--ignore installed
不受尊重是一个问题吗?在我看来。。。可编辑的安装一直是一个独立的东西,我不认为它们应该支持所有的选项,比如
--前缀
--目标
--忽略已安装的
,等等。总的来说,我的印象是这些选项没有被很好地指定。它不是pip的批评者,我自己也很难弄清楚这些选项在许多边缘情况下应该做什么,人们都有不同的期望和用例。如果将这些选项中的多个组合在一起,情况会更加复杂。--我的建议是:从venv中隔离的pip安装。