安装没有Internet的python包,并使用.tar.gz和.whl等源代码

sri*_*ath 33 python pip openstack

我们正在尝试安装几个没有互联网的python包.

For ex : python-keystoneclient
Run Code Online (Sandbox Code Playgroud)

为此,我们从https://pypi.python.org/pypi/python-keystoneclient/1.7.1下载了包,并将其保存在服务器中.

但是,在安装tar.gz和.whl软件包时,安装程​​序首先要查找依赖软件包.由于服务器中没有互联网连接,因此失败了.

例如:对于python-keystoneclient,我们有以下依赖包

stevedore (>=1.5.0)
six (>=1.9.0)
requests (>=2.5.2)
PrettyTable (<0.8,>=0.7)
oslo.utils (>=2.0.0)
oslo.serialization (>=1.4.0)
oslo.i18n (>=1.5.0)
oslo.config (>=2.3.0)
netaddr (!=0.7.16,>=0.7.12)
debtcollector (>=0.3.0)
iso8601 (>=0.1.9)
Babel (>=1.3)
argparse
pbr (<2.0,>=1.6)
Run Code Online (Sandbox Code Playgroud)

当我尝试从上面的列表中逐个安装软件包时,再次寻找嵌套依赖项.

有没有什么办法可以列出所有依赖包来安装像python-keystoneclient这样的python模块.

小智 64

这是我处理这种情况的方式:

在我可以访问Internet的机器上:

mkdir keystone-deps
pip download python-keystoneclient -d "/home/aviuser/keystone-deps"
tar cvfz keystone-deps.tgz keystone-deps
Run Code Online (Sandbox Code Playgroud)

然后将tar文件移动到无法访问Internet的目标计算机并执行以下操作:

tar xvfz keystone-deps.tgz
cd keystone-deps
pip install python_keystoneclient-2.3.1-py2.py3-none-any.whl -f ./ --no-index
Run Code Online (Sandbox Code Playgroud)

  • 这可以使用pip的"下载"选项进行更新.另外,对pip选项"no-index"进行解释会很好. (3认同)
  • 如果我的本地机器使用不同的平台怎么办? (3认同)
  • 如果我没有执行目标机器pip命令怎么办? (2认同)
  • 要添加一些细节:`pip install --help`表示:(1)-f`或`--find-links`表示`...如果是目录的本地路径或file:// url,则在目录列表中查找档案。因此,它在此目录中找到文件;(2)--no-index表示忽略包索引(仅查看--find-links URL)。所以pip install xxx.whl -f ./ --no-index表示:查找安装当前目录中的文件,而不是在远程仓库中搜索。 (2认同)
  • 为了避免平台问题,如果可能的话,您可以尝试使用[通用轮子](/sf/ask/3284054931/)(`none-any`轮子)。但如果您_必须_瞄准[特定平台](/sf/ask/3477083501/),请参阅 pip 的 `--platform` [选项](https://pip.pypa.io/en/stable/reference/pip_download/#examples)。@deed02392 (2认同)

rou*_*ble 11

如果您要从中安装一堆依赖项(例如requirements.txt),则可以执行以下操作:

mkdir dependencies
pip download -r requirements.txt -d "./dependencies"
tar cvfz dependencies.tar.gz dependencies
Run Code Online (Sandbox Code Playgroud)

并且,一旦将dependencies.tar.gz传输到没有互联网的计算机上,您将执行以下操作:

tar zxvf dependencies.tar.gz
cd dependencies
pip install * -f ./ --no-index
Run Code Online (Sandbox Code Playgroud)

  • Windows 上有与 * 等效的吗?在 Windows 工作站上时,我收到一条错误消息:错误:无效要求:“*”。 (6认同)
  • @DominikNovotný对此还有另一个答案:来自/sf/answers/3032023641/的“for %x in (dir *.whl) do python -m pip install %x”。Aso 注意到,安装是按字母顺序进行的,一些依赖于尚未安装的库将会失败。所以这个解决方案可以改进。或者您需要调用此命令,直到安装所有库。 (2认同)

Bur*_*lid 7

我们的工作情况类似,生产机器无法访问互联网; 因此,所有内容都必须在离线和离线主机上进行管理.

以下是我尝试过不同程度的成功:

  1. basket这是一个在互联网连接的主机上运行的小实用程序.它不是试图安装软件包,而是将其下载,以及将其安装到目录中所需的所有其他内容.然后,将此目录移动到目标计算机上.优点:非常简单易用,没有服务器头痛; 没有要配置的端口.缺点:没有任何真正的showstoppers,但最大的一点是它不尊重任何你可能拥有的版本; 它将始终下载最新版本的软件包.

  2. 运行本地pypi服务器.用过pypiserverdevpi.pypiserver安装和设置非常简单; devpi需要更多的探索.它们都做同样的事情 - 充当真正的pypi的代理/缓存,并作为任何本土包装的本地pypi服务器.localshop是一个新的,在我看的时候不在身边,它也有同样的想法.所以它是如何工作的是你的互联网限制机器将连接到这些服务器,然后它们连接到互联网,以便他们可以缓存和代理实际的存储库.

第二种方法的问题在于,尽管您获得了最大的兼容性并且可以访问整个Python包存储库,但您仍需要确保在目标计算机上安装了所有/所有依赖项(例如,数据库驱动程序的任何标头和建立工具链).此外,这些解决方案不适合非pypi存储库(例如,托管在github上的软件包).

我们在第二个选项上走得很远,所以我肯定会推荐它.

最终,我们厌倦了处理兼容性问题和库,我们将整个服务器马戏团迁移到商业支持的docker容器.

这意味着我们发布了预配置的所有内容,实际上不需要在生产机器上安装任何内容,这对我们来说是最令人头疼的解决方案.

我们用本地docker镜像服务器替换了pypi存储库.