我正在尝试建立一个本地目录,其中包含可以在没有互联网连接的机器上重复使用的程序包,但是某些程序包存在问题。
我首先使用
下载软件包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>
下载
答案 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 install
和pytest-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
命令从自己的镜像安装。