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

时间:2018-12-12 14:15:41

标签: python pip

由于某种原因,我不明白,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,并且由于它在全局环境中找不到,因此将从我的回购中安装。

1 个答案:

答案 0 :(得分:0)

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

在我的情况下,我的软件包是0.1,但是pypi中有一个与0.1.1同名的软件包,因此当我传递--extra-index-url https://pypi.python.org/simple来安装依赖项时,{{ 1}}实际上是在使用该索引来下载pip版本。

因此,总而言之,当您遇到以下情况:在不同的存储库中有两个不同的软件包,但是它们具有相同的名称,那么您有两种选择来确保一切都能按预期进行:

  • 将包裹的名称更改为唯一的名称,例如0.1.1
  • 在版本中添加一些ID,以便您可以安装该特定版本。为什么是身份证?因为pypi中的软件包可能与您的版本相同。

就我而言,我更喜欢第二个,因为它更干净。对于第一个,您需要username-packagename这是较难看的IMO。