并非通过“ pip download”下载所有依赖项

时间:2018-08-08 13:33:09

标签: python pip packages

我正在尝试建立一个本地目录,其中包含可以在没有互联网连接的机器上重复使用的程序包,但是某些程序包存在问题。

我首先使用

下载软件包
pip download -r requirements.txt -d my_packages --no-binary :all:

然后我尝试通过安装它们

pip install -r requirements.txt --no-index -f my_packages

我在安装时遇到问题的软件包之一是elasticsearch-dsl==6.1.0

pip install -r requirements --no-index -f my_packages
Looking in links: my_packages
Collecting elasticsearch-dsl==6.1.0
Collecting six (from elasticsearch-dsl==6.1.0)
Collecting python-dateutil (from elasticsearch-dsl==6.1.0)
  Installing build dependencies ... error
  Complete output from command /Users/Oskar/.pyenv/versions/2.7.15/envs/no_internet/bin/python2.7 -m pip install --ignore-installed --no-user --prefix /private/var/folders/36/t0_t6_td2f560t2j0149vjmw0000gn/T/pip-build-env-moib0N --no-warn-script-location --no-binary :none: --only-binary :none: --no-index --find-links my_packages -- setuptools wheel:
  Looking in links: my_packages
  Collecting setuptools
    Could not find a version that satisfies the requirement setuptools (from versions: )
  No matching distribution found for setuptools

当然,setuptools我可以手动安装,但是软件包比其他所有软件包所需的软件包更多。 django-guardian==1.4.9是另一个示例,它需要pytest-runner,由于某些原因,该pip download并未随<div class="container"> <div class="div1">DIV 1</div> <div class="div2">DIV 2</div> <div class="div3">DIV 3</div> </div> 下载

3 个答案:

答案 0 :(得分:5)

使用pip wheel而不是pip download来预先下载并编译您的依赖项。

$ pip install wheel
$ pip wheel -w my_wheels python-dateutil --no-binary :all:
$ pip install -f my_wheels --no-index python-dateutil    # works
$ pip install -f my_packages --no-index python-dateutil  # breaks

pip wheel构建python-dateutil包,因此以后在{​​{1}}期间不需要setuptools_scm

根据文档

  

车轮是一种内置包装格式,具有以下优点:     在每次安装期间重新编译软件。

因此,我推测pip install将使用构建时依赖性,例如pip wheel,但setuptools_scm不会,因为已经构建了pip install。 / p>

.whl选项仍然可以正确执行:下载--no-binary :all:中的源代码,而不下载任何二进制发行版。

(jwodder精明地指出了运行时依赖性 ie .tar.gz与构建时依赖性 ie install_requires之间的区别。)

我在本地环境中对此进行了测试,没有setup_requires也没有setuptools_scm,没问题。

pytest-runner

答案 1 :(得分:4)

因为您指定了--no-binary :all:,所以pip仅下载软件包的sdists,而不下载任何轮子。但是,pip在安装时仍然需要轮式的每个软件包,因此pip install尝试为sdist中的每个软件包构建一个轮式,因此此步骤需要setuptools,{{1} },以及软件包wheel中列出的所有内容。我不知道为什么您的环境没有setup_requires,但是任何健康的Python环境都应在创建环境时同时安装它和setuptools

不幸的是,wheel中列出的软件包是由setup_requires本身而不是pip安装的,因此setuptools无法满足这些要求。如果您坚持使用pip download,那么唯一的解决方案是手动编译--no-binary :all:运行时丢失的软件包列表,下载它们,然后在依赖于这些软件包之前安装缺失的软件包他们,否则configure setuptools to look for the downloads in my_packages。幸运的是,该列表可能会很短(可能仅为pip installpytest-runner)。

答案 2 :(得分:2)

您可以使用pip2pi来避免重新发明轮子,这是用于创建自己的点子存储库的非常方便的工具。我为团队维护了部分pypi镜像,并在此项目中取得了最佳效果。

在其Github页面上:“ pip2pi根据pip要求构建了与PyPI兼容的软件包存储库”

$ pip install pip2pi
$ mkdir packages
$ pip2tgz packages/ -r requirements.txt
$ dir2pi -n packages/ # <--- this builds/updates the index, i.e. the "simple/" directory

现在,只需通过http提供package / simple /文件夹,并将其用作索引即可。

$ pip install -i http://myserver.net/simple/ -r requirements.txt

为避免麻烦的点子安全检查,您可以像这样调整pip.conf:

[global]
format=columns
disable_pip_version_check = 1
index-url=file:http://myserver.net/simple/

现在,您可以使用常规pip install命令从自己的镜像安装。