pip 从 Python 的 pypi 而不是我自己的服务器获取包



由于某些原因,我无法理解,pip从全局的pypi而不是从我自己的服务器获取包。我的包,我们称之为foo,有一个依赖项bar

pip search --index-url https://example.com/simple foo

退回我的包裹。

pip install --index-url https://example.com/simple foo

由于无法下载bar,导致出现错误。

Could not find a version that satisfies the requirement bar (from foo) (from versions: )
No matching distribution found for bar (from foo)

pip install --index-url https://example.com/simple --extra-index-url https://pypi.python.org/simple foo

好的,所以这个问题现在应该解决了,对吧?它会从我的索引中得到foo,从pypi中得到bar,对吗?好恐怕情况并非如此。使用此配置,它不是从我的索引下载foo,而是在pypi中下载foo包。即使在安装之后,如果我再次运行pip search foo,它也会检测到我的是latest,但全局的是installed

为了测试的目的,为了有一个干净的基线,我尝试了python:3.7-alpine,结果相同。

作为一种变通方法,我将包的版本设置为yzt-0.1,这样我就可以专门安装foo:yzt-0.1,因为它在全局中找不到它,所以它将从我的repo中安装。

好的,问题是pip的工作方式。如果未指定版本,它将始终下载最新版本,即使这意味着在主索引中存在另一个版本时从extra索引中获取该版本。

在我的案例中,我的包是0.1,但在pypi中有一个与0.1.1同名的包,所以当我传递--extra-index-url https://pypi.python.org/simple来安装依赖项时,pip实际上也在使用该索引下载0.1.1版本。

因此,总的来说,当你面临这样一种情况,即你在不同的存储库中有两个不同的包,但名称相同,你有两个选择来确保一切都能按预期工作:

  • 将包的名称更改为唯一的名称,如username-packagename
  • 在版本中添加一些id,以便您可以安装该特定版本。为什么是id?因为pypi中的包可能与您的版本相同

就我而言,我更喜欢第二个,因为它更干净。有了第一个,你需要import username-packagename,它更丑IMO.

最新更新