【问题标题】:How to install packages offline?如何离线安装包?
【发布时间】:2012-06-20 22:34:45
【问题描述】:

从 pypi 下载 python 包及其依赖项以在另一台机器上离线安装的最佳方式是什么?使用 pip 或 easy_install 有什么简单的方法吗?我正在尝试在未连接到 Internet 的 FreeBSD 机器上安装请求库。

【问题讨论】:

标签: python pip freebsd easy-install python-requests


【解决方案1】:

对于 Windows,我使用了以下内容

互联网连接

1.创建任何名称的目录。我已经用“repo”创建了

2.使用以下命令下载库(它将下载而不是安装)

pip 下载库名称 -d"C:\repo"

pip download openpyxl -d"C:\repo"
  1. 然后你会发现多个 .whl 扩展文件

  2. 复制 requirements.txt 中的所有文件名

没有互联网连接

  1. 现在将此文件夹和文件移动到没有 Internet 连接的 PC 并运行以下命令。
pip install -r requirements.txt --find-links=C:\repo --no-index

【讨论】:

    【解决方案2】:

    在可以访问互联网的系统上

    pip download 命令让您无需安装即可下载包:

    pip download -r requirements.txt

    (在以前的 pip 版本中,拼写为 pip install --download -r requirements.txt。)

    在无法访问互联网的系统上

    然后就可以使用了

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt

    安装那些下载的模块,无需访问网络。

    【讨论】:

    • 这个问题是依赖关系可能有其他依赖关系并且不会被下载。
    • @vikki 不正确,“pip install --download”也会下载依赖项,因此即使您的要求有额外的依赖项,上述命令也能正常工作。蛇篮可能会做其他有用的事情(从未使用过),但绝对不需要它。
    • @vikki 我明白你在说什么,但我告诉你这不是真的 :-) 你应该在再次发布相同的断言之前去尝试一下。我只是将“pytest”放在 requirements.txt 中,运行“pip install --download .-r requirements.txt”,然后它为 pytest 及其 setup.py 依赖项“py”下载了 sdists。
    • 就像@vikki,对我来说这也没有下载整个依赖图。但是,我仍然很感激这个答案,因为它只是缺少一个包,我只是明确地将它添加到 requirements.txt 中。
    • 我认为应该是:--find-links file:/path/to/some/dir/ 并且您应该使用相同版本的 pip 下载并安装 - 否则可能会失败
    【解决方案3】:

    作为@chaokunyang 的继续回答,我想把我写的脚本放在这里:

    1. 编写一个“requirements.txt”文件,指定要打包的库。
    2. 创建一个包含所有库的 tar 文件(请参阅 Packer 脚本)。
    3. 将创建的 tar 文件放入目标机器并解压。
    4. 运行安装程序脚本(也打包到 tar 文件中)。

    “requirements.txt”文件

    docker==4.4.0
    

    Packer端:文件名:“create-offline-python3.6-dependencies-repository.sh”

    #!/usr/bin/env bash
    
    # This script follows the steps described in this link:
    # https://stackoverflow.com/a/51646354/8808983
    
    LIBRARIES_DIR="python3.6-wheelhouse"
    
    if [ -d ${LIBRARIES_DIR} ]; then
        rm -rf ${LIBRARIES_DIR}/*
    else
        mkdir ${LIBRARIES_DIR}
    fi
    
    pip download -r requirements.txt -d ${LIBRARIES_DIR}
    
    files_to_add=("requirements.txt" "install-python-libraries-offline.sh")
    
    for file in "${files_to_add[@]}"; do
        echo "Adding file ${file}"
        cp "$file" ${LIBRARIES_DIR}
    done
    
    tar -cf ${LIBRARIES_DIR}.tar ${LIBRARIES_DIR}
    

    安装程序端:文件名:“install-python-libraries-offline.sh”

    #!/usr/bin/env bash
    
    # This script follows the steps described in this link:
    # https://stackoverflow.com/a/51646354/8808983
    
    # This file should run during the installation process from inside the libraries directory, after it was untared:
    # pythonX-wheelhouse.tar -> untar -> pythonX-wheelhouse
    # |
    # |--requirements.txt
    # |--install-python-libraries-offline.sh
    
    
    pip3 install -r requirements.txt --no-index --find-links .
    

    【讨论】:

    • 在虚拟环境中安装软件包时有帮助的另一件事是在创建环境后添加此命令。 python3 -m pip install --upgrade pip 。不这样做会导致虚假错误。
    【解决方案4】:

    我遇到了类似的问题。而且我必须以相同的方式安装它,我们从 pypi 安装。

    我做了以下事情:

    1. 创建一个目录来存储所有可以访问互联网的机器中的包。

      mkdir -p /path/to/packages/
      
    2. 下载所有包到路径

    编辑:你也可以试试:

    python3 -m pip wheel --no-cache-dir -r requirements.txt -w /path/to/packages
    
    pip download -r requirements.txt -d /path/to/packages
    
    Eg:- ls /root/wheelhouse/  # **/root/wheelhouse** is my **/path/to/packages/**
    total 4524
    -rw-r--r--. 1 root root   16667 May 23  2017 incremental-17.5.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   34713 Sep  1 10:21 attrs-18.2.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root 3088398 Oct 15 14:41 Twisted-18.9.0.tar.bz2
    -rw-r--r--. 1 root root  133356 Jan 28 15:58 chardet-3.0.4-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  154154 Jan 28 15:58 certifi-2018.11.29-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   57987 Jan 28 15:58 requests-2.21.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   58594 Jan 28 15:58 idna-2.8-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  118086 Jan 28 15:59 urllib3-1.24.1-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   47229 Jan 28 15:59 tqdm-4.30.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root    7922 Jan 28 16:13 constantly-15.1.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root  164706 Jan 28 16:14 zope.interface-4.6.0-cp27-cp27mu-manylinux1_x86_64.whl
    -rw-r--r--. 1 root root  573841 Jan 28 16:14 setuptools-40.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37638 Jan 28 16:15 Automat-0.7.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   37905 Jan 28 16:15 hyperlink-18.0.0-py2.py3-none-any.whl
    -rw-r--r--. 1 root root   52311 Jan 28 16:15 PyHamcrest-1.9.0-py2.py3-none-any.whl
     -rw-r--r--. 1 root root   10586 Jan 28 16:15 six-1.12.0-py2.py3-none-any.whl
    
    1. 压缩包目录并将其复制到无法访问 Internet 的机器上。然后做,

      cd /path/to/packages/
      tar -cvzf packages.tar.gz .  # not the . (dot) at the end
      

    packages.tar.gz 复制到无法访问 Internet 的目标计算机中。

    1. 在无法访问互联网的机器上,执行以下操作(假设您将 tarred 包复制到当前机器中的 /path/to/package/

      cd /path/to/packages/
      tar -xvzf packages.tar.gz
      mkdir -p $HOME/.config/pip/
      vi $HOME/.config/pip/pip.conf
      

    在里面粘贴以下内容并保存。

    [global]
    timeout = 10
    find-links = file:///path/to/package/
    no-cache-dir = true
    no-index = true
    
    1. 最后,我建议你使用某种形式的virtualenv 来安装软件包。

      virtualenv -p python2 venv # use python3, if you are on python3
      source ./venv/bin/activate
      pip install <package>
      

    您应该能够下载目录 /path/to/package/ 中的所有模块。

    注意:我只这样做了,因为我无法添加选项或更改我们安装模块的方式。否则我会做的

    pip install --no-index --find-links /path/to/download/dir/ -r requirements.txt
    

    【讨论】:

      【解决方案5】:

      从 Pypi 下载 wheel 文件(例如 dlb-0.5.0-py3-none-any.whl)和

      pip install dlb-0.5.0-py3-none-any.whl
      

      【讨论】:

        【解决方案6】:

        让我一步一步完成这个过程:

        1. 在连接到 Internet 的计算机上,创建一个文件夹。
           $ mkdir packages
           $ cd packages
        
        1. 打开命令提示符或 shell 并执行以下命令:

          假设你想要的包是 tensorflow

          $ pip download tensorflow

        2. 现在,在目标计算机上,复制packages 文件夹并应用以下命令

          $ cd packages
          $ pip install 'tensorflow-xyz.whl' --no-index --find-links '.'
        

        请注意,tensorflow-xyz.whl 必须替换为所需包的原始名称。

        【讨论】:

        • 这是我需要的简单而简短的答案。
        【解决方案7】:

        如果您想离线安装 python 库及其依赖项,请在安装了相同操作系统、网络连接和 python 的机器上完成以下步骤:

        1) 创建一个具有相似内容的requirements.txt 文件(注意 - 这些是您要下载的库):

        Flask==0.12
        requests>=2.7.0
        scikit-learn==0.19.1
        numpy==1.14.3
        pandas==0.22.0
        

        创建需求文件的一个选项是使用pip freeze &gt; requirements.txt。这将列出您环境中的所有库。然后您可以进入requirements.txt 并删除不需要的。

        2) 执行命令mkdir wheelhouse &amp;&amp; pip download -r requirements.txt -d wheelhouse将库及其依赖下载到目录wheelhouse

        3) 将 requirements.txt 复制到wheelhouse 目录中

        4) 使用tar -zcf wheelhouse.tar.gz wheelhouse 将操舵室存档到wheelhouse.tar.gz

        然后上传wheelhouse.tar.gz到你的目标机器:

        1) 执行tar -zxf wheelhouse.tar.gz解压文件

        2) 执行pip install -r wheelhouse/requirements.txt --no-index --find-links wheelhouse 安装库及其依赖项

        【讨论】:

        • 这是最清晰的答案,适合初学者。谢谢
        • 这是迄今为止我见过的最 Pythonic 的方式。谢谢!
        • 但是按照您的指示,当我最后pip install 时,它说:错误:找不到满足要求的版本..`
        • @DennisLi 你的 python 和 pip 版本是什么?
        • 这个工作流的一个问题是不同的架构。如果您在 Mac 上运行 pip download ...,您将拥有无法使用的 *-macosx*.whl 文件,例如linux
        【解决方案8】:

        离线python。为此,我使用 virtualenv(隔离 Python 环境)

        1) 安装 virtualenv 使用 pip 在线:

        pip install virtualenv --user
        

        或使用 whl 离线:转到此 link ,下载最新版本(.whl 或 tar.gz)并使用以下命令安装:

        pip install virtualenv-15.1.0-py2.py3-none-any.whl --user
        

        通过使用--user,您不需要使用sudo pip…

        2) 使用虚拟环境

        在在线机器上选择带有终端cd的目录并运行此代码:

        python -m virtualenv myenv
        cd myenv
        source bin/activate
        pip install Flask
        

        安装完所有的包后,你必须生成一个requirements.txt,所以当你的 virtualenv 处于活动状态时,写

        pip freeze > requirements.txt
        

        打开一个新终端并创建另一个环境,例如myenv2

        python -m virtualenv myenv2
        cd myenv2
        source bin/activate
        cd -
        ls
        

        现在您可以转到您的requirements.txttranferred_packages 文件夹所在的离线文件夹。下载包含以下代码的包并将它们全部放入tranferred_packages文件夹。

        pip download -r requirements.txt
        

        将您的离线文件夹带到离线计算机,然后

        python -m virtualenv myenv2
        cd myenv2
        source bin/activate
        cd -
        cd offline
        pip install --no-index --find-links="./tranferred_packages" -r requirements.txt
        

        离线文件夹中有什么 [requirements.txt , tranferred_pa​​ckages {Flask-0.10.1.tar.gz, ...}]

        检查您的包裹清单

        pip list
        

        注意:因为我们在 2017 年,最好使用 python 3。您可以使用此命令创建 python 3 virtualenv。

        virtualenv -p python3 envname
        

        【讨论】:

        • 这里似乎缺少步骤或“混淆”,我希望看到“停用”然后“点冻结”... cd offline 和 ./tranferred_pa​​ckages 不知从何而来 - 显然这需要清理吗?
        • 也许可以,但您应该考虑“我想要一个简短的帖子”,“这个过程很复杂,我无法编写每个步骤(只有在 YouTube 中才有可能)”。
        • 这是最好的答案恕我直言。帮了大忙
        • 如果它对如何设置 tranferred_pa​​ckages 文件夹有任何说明,这将是最好的答案。没有关键步骤,-1
        【解决方案9】:

        使用wheel 编译的包。

        捆绑:

        $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
        $ pip wheel -r requirements.txt --wheel-dir=$tempdir
        $ cwd=`pwd`
        $ (cd "$tempdir"; tar -cjvf "$cwd/bundled.tar.bz2" *)
        

        复制压缩包并安装:

        $ tempdir=$(mktemp -d /tmp/wheelhouse-XXXXX)
        $ (cd $tempdir; tar -xvf /path/to/bundled.tar.bz2)
        $ pip install --force-reinstall --ignore-installed --upgrade --no-index --no-deps $tempdir/*
        

        注意wheel 二进制包不跨机器。

        更多参考。这里:https://pip.pypa.io/en/stable/user_guide/#installation-bundles

        【讨论】:

        • 我在使用 Python 3.6 在机器上捆绑并使用 Python 3.5 在另一台机器上提取时遇到问题:“.whl 不是此平台上支持的轮子”。源版本和目标版本可能需要与某些包匹配。
        【解决方案10】:

        对于 Pip 8.1.2,您可以使用 pip download -r requ.txt 将包下载到本地计算机。

        【讨论】:

          【解决方案11】:

          下载tarball,将其传输到你的FreeBSD机器并解压,然后运行python setup.py install就完成了!

          编辑:补充一点,您现在也可以使用 pip 安装 tarball。

          【讨论】:

          • 所有依赖项呢?解决它们的最佳方法是什么?我是否也需要手动安装依赖项?
          • 是的,不幸的是,这是我知道的唯一方法。
          【解决方案12】:

          如果包在 PYPI 上,请将其及其依赖项下载到某个本地目录。 例如

          $ mkdir /pypi && cd /pypi $ ls -la -rw-r--r-- 1 个铺路人员 237954 Apr 19 11:31 Flask-WTF-0.6.tar.gz -rw-r--r-- 1 名铺路人员 389741 Feb 22 17:10 Jinja2-2.6.tar.gz -rw-r--r-- 1 名铺路人员 70305 Apr 11 00:28 MySQL-python-1.2.3.tar.gz -rw-r--r-- 1 个铺路人员 2597214 Apr 10 18:26 SQLAlchemy-0.7.6.tar.gz -rw-r--r-- 1 名铺路人员 1108056 2 月 22 日 17:10 Werkzeug-0.8.2.tar.gz -rw-r--r-- 1 名铺路人员 488207 Apr 10 18:26 boto-2.3.0.tar.gz -rw-r--r-- 1 名铺路人员 490192 Apr 16 12:00 flask-0.9-dev-2a6c80a.tar.gz

          某些包可能必须手动归档到外观相似的 tarball 中。当我想要更新(不太稳定)版本的东西时,我经常这样做。有些包不在 PYPI 上,所以同样适用于它们。

          假设您在 ~/src/myapp 中有一个格式正确的 Python 应用程序。 ~/src/myapp/setup.py 将有 install_requires 列表,其中提到您在 /pypi 目录中拥有的一件或多件事情。像这样:

            install_requires=[
              'boto',
              'Flask',
              'Werkzeug',
              # and so on
          

          如果您希望能够运行具有所有必要依赖项的应用程序,同时仍对其进行破解,您将执行以下操作:

          $ cd ~/src/myapp $ python setup.py develop --always-unzip --allow-hosts=None --find-links=/pypi

          这样您的应用程序将直接从您的源目录执行。你可以修改一些东西,然后重新运行应用程序而不重建任何东西。

          如果您想将您的应用及其依赖项安装到当前的 python 环境中,您将执行以下操作:

          $ cd ~/src/myapp $ easy_install --always-unzip --allow-hosts=None --find-links=/pypi 。

          在这两种情况下,如果/pypi 目录中不存在一个或多个依赖项,则构建将失败。它不会尝试从 Internet 上随意安装丢失的东西。

          我强烈建议在活动的virtual environment 中调用setup.py develop ...easy_install ...,以避免污染您的全局Python 环境。这是(virtualenv 就是)几乎要走的路。永远不要在全局 Python 环境中安装任何东西。

          如果您构建应用程序的机器与您要在其上部署应用程序的机器具有相同的架构,您可以简单地将整个虚拟环境目录压缩到其中easy_install-ed 所有内容。不过,在打包之前,您必须使虚拟环境目录可重定位(请参阅--relocatable 选项)。 注意: 目标机器需要安装相同版本的 Python,并且您的应用可能具有的任何基于 C 的依赖项也必须预安装在那里(例如,如果您依赖于 PIL,则libpng、libjpeg 等必须预先安装)。

          【讨论】:

          • 你可以使用开关--no-index代替--allow-hosts=None
          • 您能否详细说明如何创建格式正确的 Python 应用程序?
          • @PrabhjotRai 请参考packaging.python.org/distributing
          猜你喜欢
          • 1970-01-01
          • 2020-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多