关于pip:Python包离线安装

Python Packages Offline Installation

从pypi下载python包和它的依赖项以便在另一台机器上进行离线安装的最佳方法是什么?有什么简单的方法可以通过PIP或简单的安装来做到这一点吗?我正在尝试将请求库安装在未连接到Internet的FreeBSD设备上。


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安装下载的sdist,而无需访问网络。


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

1
2
3
4
5
6
7
8
9
$ mkdir /pypi && cd /pypi
$ ls -la
  -rw-r--r--   1 pavel  staff   237954 Apr 19 11:31 Flask-WTF-0.6.tar.gz
  -rw-r--r--   1 pavel  staff   389741 Feb 22 17:10 Jinja2-2.6.tar.gz
  -rw-r--r--   1 pavel  staff    70305 Apr 11 00:28 MySQL-python-1.2.3.tar.gz
  -rw-r--r--   1 pavel  staff  2597214 Apr 10 18:26 SQLAlchemy-0.7.6.tar.gz
  -rw-r--r--   1 pavel  staff  1108056 Feb 22 17:10 Werkzeug-0.8.2.tar.gz
  -rw-r--r--   1 pavel  staff   488207 Apr 10 18:26 boto-2.3.0.tar.gz
  -rw-r--r--   1 pavel  staff   490192 Apr 16 12:00 flask-0.9-dev-2a6c80a.tar.gz

有些包裹可能需要手工归档成类似的tarballs。当我想要一个更新的(不太稳定的)版本的东西时,我经常这样做。有些包不在pypi上,所以它们也适用。

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

1
2
3
4
5
  install_requires=[
    'boto',
    'Flask',
    'Werkzeug',
    # and so on

如果你想在黑客攻击的同时运行你的应用程序,你可以这样做:

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

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

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

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

在这两种情况下,如果在/pypi目录中没有一个或多个依赖项,则构建将失败。它不会试图乱安装互联网上丢失的东西。

我强烈建议在活动的虚拟环境中调用setup.py develop ...easy_install ...,以避免污染全局python环境。这是(virtualenv,也就是说)基本上要走的路。不要在全局python环境中安装任何东西。

如果您构建应用程序的机器与您要在其上部署应用程序的机器具有相同的体系结构,那么您可以简单地对整个虚拟环境目录进行tarball处理,您可以将所有内容添加到该目录中。不过,在进行tarballing之前,必须使虚拟环境目录可重定位(请参见--relocatable选项)。注意:目标机器需要安装相同版本的python,并且应用程序可能也必须预先安装基于C的依赖项(例如,假设您依赖pil,则必须预先安装libpng、libjpeg等)。


离线python。为此,我使用virtualenv(独立的python环境)

1)安装virtualenv在线PIP:

1
pip install virtualenv --user

或使用whl脱机:转到此链接,下载最新版本(.whl或tar.gz)并使用以下命令安装:

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

使用--user不需要使用sudo pip…

2)使用virtualenv

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

1
2
3
4
python -m virtualenv myenv
cd myenv
source bin/activate
pip install Flask

安装完所有软件包后,您必须生成一个requirements.txt,因此当您的virtualenv处于活动状态时,请编写

1
pip freeze > requirements.txt

打开一个新终端并创建另一个env,如myenv2

1
2
3
4
5
python -m virtualenv myenv2
cd myenv2
source bin/activate
cd -
ls

现在,您可以转到脱机文件夹,其中包含您的requirements.txttranferred_packages文件夹。下载包含以下代码的软件包,并将其全部放到tranferred_packages文件夹中。

1
pip download -r requirements.txt

将脱机文件夹带到脱机计算机,然后

1
2
3
4
5
6
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,tranfered_packages flask-0.10.1.tar.gz,]

你的包裹清单

1
pip list

注意:正如我们在2017年所做的,最好使用python 3。可以使用此命令创建python 3 virtualenv。

1
virtualenv -p python3 envname


下载tarball,把它转移到你的freebsd机器并提取它,然后运行python setup.py install,你就完成了!

编辑:除了这个,你现在也可以用pip安装tarballs。


如果要脱机安装python libs及其依赖项,请在安装了相同操作系统、网络连接和python的计算机中完成以下步骤:

1)创建一个requirements.txt文件,内容如下:

1
2
3
4
5
Flask==0.12
requests>=2.7.0
scikit-learn==0.19.1
numpy==1.14.3
pandas==0.22.0

2)执行命令mkdir wheelhouse && pip download -r requirements.txt -d wheelhouse将lib及其依赖项下载到direcotry 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安装libs及其依赖项


使用wheel编译的包。

捆绑:

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

复制tarball并安装:

1
2
3
$ 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/安装包


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


我也有类似的问题。我必须让它以同样的方式安装,我们从Pypi安装。

我做了以下事情:

  • 创建一个目录来存储计算机中所有可以访问Internet的包。

    1
    mkdir -p /path/to/packages/
  • 将所有包下载到路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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
  • tar包目录并将其复制到没有Internet访问权限的计算机上。然后这样做,

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

    将packages.tar.gz复制到没有Internet访问的目标计算机中。

  • 在没有Internet访问权限的计算机中,执行以下操作(假设您将已标记的包复制到当前计算机中的/path/to/package/)

    1
    2
    3
    4
    5
    cd /path/to/packages/
    tar -xvzf packages.tar.gz
    mkdir -p $HOME/.config/pip/

    vi $HOME/.config/pip/pip.conf

    并将以下内容粘贴到内部并保存。

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

    1
    2
    3
    virtualenv -p python2 venv # use python3, if you are on python3
    source ./venv/bin/activate
    pip install <package>
  • 您应该能够下载目录/path/to/package/中的所有模块。

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

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