【问题标题】:installing python packages without internet and using source code as .tar.gz and .whl在没有互联网的情况下安装 python 包并使用源代码作为 .tar.gz 和 .whl
【发布时间】:2016-08-12 01:43:27
【问题描述】:

我们正在尝试在没有互联网的情况下安装几个 python 包。

For ex : python-keystoneclient

为此,我们从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)

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

有什么方法可以列出ALL 用于安装python 模块(如python-keystoneclient)的依赖包。

【问题讨论】:

  • 你可能有幸为此使用容器。

标签: python pip openstack


【解决方案1】:

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

在我可以上网的机器上:

mkdir keystone-deps
pip download python-keystoneclient -d "/home/aviuser/keystone-deps"
tar cvfz keystone-deps.tgz keystone-deps

然后将 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

您可能需要在命令中添加--no-deps,如下所示:

pip install python_keystoneclient-2.3.1-py2.py3-none-any.whl -f ./ --no-index --no-deps

【讨论】:

  • 这可以通过 pip 的“下载”选项进行更新。此外,最好能解释一下 pip 选项“no-index”。
  • @GianlucaD'Ardia -- 我也下载了pip 轮子,您可以使用以下(trippy)命令自行安装它:python ~/eggs/pip-9.0.1-py2.py3-none-any.whl/pip install --no-index ~/eggs/pip-9.0.1-py2.py3-none-any.whl(将版本详细信息替换为轮子的详细信息)
  • 补充一些细节:pip install --help表示:(1)-f--find-links表示...If a local path or file:// url that's a directory, then look for archives in the directory listing.,所以这里定位到这个目录下的文件; (2)--no-index 表示Ignore package index (only looking at --find-links URLs instead). 所以pip install xxx.whl -f ./ --no-index 表示:在当前目录中查找安装文件,而不是在远程仓库中搜索。
  • 如果我的本地机器使用不同的平台怎么办?
  • 为避免平台问题,如果可能,您可以尝试使用universal wheelsnone-any 轮子)。但如果您必须specific platform 为目标,请参阅pip 的--platform option。 @deed02392
【解决方案2】:

如果你想从 requirements.txt 安装一堆依赖项,你可以这样做:

mkdir dependencies
pip download -r requirements.txt -d "./dependencies"
tar cvfz dependencies.tar.gz dependencies

而且,一旦你将 dependencies.tar.gz 转移到没有互联网的机器上,你会这样做:

tar zxvf dependencies.tar.gz
cd dependencies
pip install * -f ./ --no-index

【讨论】:

  • 这个方法对我有用,我只是觉得你真的不需要第二行的引号。
  • 在 Windows 上是否有 * 的等价物?我收到一条错误消息:在 Windows 站上时出现错误:错误:无效要求:'*'。
  • Windows 没有 tar,但你可以制作一个 zip 文件夹。如果不是从命令行,你可以使用典型的右键菜单来制作一个 zip。
  • @DominikNovotný 对此有另一个答案:for %x in (dir *.whl) do python -m pip install %x 来自stackoverflow.com/a/43314623/8537739。请注意,安装是按字母顺序进行的,并且一些依赖于尚未安装的库将失败。所以这个解决方案可以改进。或者您需要调用此命令,直到所有库都安装完毕。
【解决方案3】:

我们在工作中也有类似的情况,生产机器无法上网;因此,一切都必须离线和脱离主机进行管理。

以下是我尝试并取得了不同程度的成功:

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

  2. 运行本地 pypi 服务器。使用pypiserverdevpipypiserver 安装和设置超级简单; devpi 需要更多的琢磨。它们都做同样的事情——充当真正 pypi 的代理/缓存,并充当任何自制软件包的本地 pypi 服务器。 localshop 是我看的时候不在身边的一个新的,它也有同样的想法。因此,它的工作原理是您的受 Internet 限制的机器将连接到这些服务器,然后将它们连接到 Internet,以便它们可以缓存和代理实际的存储库。

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

不过,我们在第二个选项上已经走了很远,所以我肯定会推荐它。

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

这意味着我们交付的所有东西都是预先配置的,实际上不需要在生产机器上安装任何东西,这对我们来说是最轻松的解决方案。

我们将 pypi 存储库替换为本地 docker 映像服务器。

【讨论】:

    【解决方案4】:

    pipdeptree 是一个命令行实用程序,用于以依赖树的形式显示安装在 virtualenv 中的 python 包。 只需使用它: https://github.com/naiquevin/pipdeptree

    【讨论】:

      【解决方案5】:

      这不是答案。我很挣扎,但后来意识到我的安装正在尝试连接到 Internet 以下载依赖项。

      所以,我首先下载并安装了依赖项,然后使用以下命令进行安装。成功了

      python -m pip install filename.tar.gz
      

      【讨论】:

        猜你喜欢
        • 2013-10-16
        • 1970-01-01
        • 2017-04-12
        • 2012-05-18
        • 2017-03-15
        • 2018-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多