オフライン環境構築 pip編

[オフライン環境構築 目次へ](https://qiita.com/kannkyo/items/1e5f8362ed591ebda33d)

# 概要

オフライン環境で、pipパッケージをインストールするための手順です。

## ポイント

手順を説明する前に、まずpipのパッケージの仕組みを説明します。

### pipパッケージの種類

実は、pip パッケージは、pythonやOSの種類やバージョンによって何十種類もあります。

たとえば、[numpy](https://pypi.org/project/numpy/#files)のパッケージは、以下29種類も提供されています。

| Filename, size                                               | File type | Python version |
| :----------------------------------------------------------- | :-------- | :------------- |
| [numpy-1.21.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl ](https://files.pythonhosted.org/packages/64/1d/24b83eb738ce77eb014777c1ae6480ad82c7599361735f0cfcb0d4788e57/numpy-1.21.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl) | Wheel     | cp310          |
| [numpy-1.21.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl ](https://files.pythonhosted.org/packages/52/0b/0bacc59bff3b52ecb276cec6674b751d9d403fc116a11306dc697b449c76/numpy-1.21.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl) | Wheel     | cp310          |
| [numpy-1.21.2-cp37-cp37m-macosx_10_9_x86_64.whl ](https://files.pythonhosted.org/packages/e0/54/49206c6aba7d0e7d5a6e2f5b6760a00e35bb705e9d2be007be0a16e4ba40/numpy-1.21.2-cp37-cp37m-macosx_10_9_x86_64.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl ](https://files.pythonhosted.org/packages/78/01/17f8c6c865110694ae8e21ad84288860e6487f55f70c967fbbf43dd59f8f/numpy-1.21.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl ](https://files.pythonhosted.org/packages/68/2d/0fe6592a96a1da097a33fb87b9618197c8a1801e84c7483fa7b93794a87c/numpy-1.21.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl ](https://files.pythonhosted.org/packages/5c/61/b2f14fb5aa1198fa63c6c90205dc2557df5cacdeb0b16d66abc6af8724b8/numpy-1.21.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl ](https://files.pythonhosted.org/packages/13/43/49ef25dd73f046f6d5205a5e52532e3b7efa15c42d5098a801bbe6c62cf0/numpy-1.21.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl ](https://files.pythonhosted.org/packages/8f/3d/7247b219c2c3bc5720a0ae963bf384df1f7f39c17330fcff2bd9d8640768/numpy-1.21.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-win32.whl ](https://files.pythonhosted.org/packages/79/90/914f2bf7d5bfae92b1b9d8e730b347dacd613008045dd538e18c1c49d56d/numpy-1.21.2-cp37-cp37m-win32.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp37-cp37m-win_amd64.whl ](https://files.pythonhosted.org/packages/3b/d7/3e9f4291aaac0ccd61cd0b3ccfb3a192f3f2d6be8c86a02d0b93811ff1ee/numpy-1.21.2-cp37-cp37m-win_amd64.whl) | Wheel     | cp37           |
| [numpy-1.21.2-cp38-cp38-macosx_10_9_universal2.whl ](https://files.pythonhosted.org/packages/6d/2b/167a5fc6d37b65ca9924f748add4d563240ae1505d47e5a28a4d4b19cf31/numpy-1.21.2-cp38-cp38-macosx_10_9_universal2.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-macosx_10_9_x86_64.whl ](https://files.pythonhosted.org/packages/92/56/5005c13251da910edaa9768840c6dd6a68df45b69f3d026bc43ab1a79f4b/numpy-1.21.2-cp38-cp38-macosx_10_9_x86_64.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-macosx_11_0_arm64.whl ](https://files.pythonhosted.org/packages/16/55/ac6bb76315448882798d9079dcb012759f9d32c05f827d7c13f7e335d8bb/numpy-1.21.2-cp38-cp38-macosx_11_0_arm64.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl ](https://files.pythonhosted.org/packages/6e/7d/261701d028b3e610f17fb4454eff7e528547b7ed4fed3bd26dec73ee8d6a/numpy-1.21.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl ](https://files.pythonhosted.org/packages/aa/69/260a4a1cc89cc00b51f432db048c396952f5c05dfa1345a1b3dbd9ea3544/numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl ](https://files.pythonhosted.org/packages/36/4b/4116a1b27e02d186af2220945a549d09a38092944c55938f0af9e2e7b06b/numpy-1.21.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl ](https://files.pythonhosted.org/packages/c3/9f/90cfafcb366c1292c646dbf9b2a5cf0b420e34e814acf0484d2f443482fc/numpy-1.21.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl ](https://files.pythonhosted.org/packages/18/d3/0b5dbf3dd99f6a645612dc8cd78c633130139d98afb5303a3ce09723609b/numpy-1.21.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-win32.whl ](https://files.pythonhosted.org/packages/db/22/3f849b40d202bef2631c8d2234e6156a5c749e0dc9079d13bea95e9d231c/numpy-1.21.2-cp38-cp38-win32.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp38-cp38-win_amd64.whl ](https://files.pythonhosted.org/packages/db/67/aa68c92b976b42403c9742b823bb74a007ed8f332764158f68998d260a01/numpy-1.21.2-cp38-cp38-win_amd64.whl) | Wheel     | cp38           |
| [numpy-1.21.2-cp39-cp39-macosx_10_9_universal2.whl ](https://files.pythonhosted.org/packages/cf/96/4a0eed13a185da6f7e48f76739de86c21661fe6c2738f4630a628d5dcbcf/numpy-1.21.2-cp39-cp39-macosx_10_9_universal2.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-macosx_10_9_x86_64.whl ](https://files.pythonhosted.org/packages/24/ad/b1fc85dda2d40af2b28c70f741df80ee0e243502b61b33baf7fa150760f8/numpy-1.21.2-cp39-cp39-macosx_10_9_x86_64.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-macosx_11_0_arm64.whl ](https://files.pythonhosted.org/packages/e8/66/380373a412dda1f321773b3872dd0d1fcb4ceac7b8c62baf436a31ce4638/numpy-1.21.2-cp39-cp39-macosx_11_0_arm64.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl ](https://files.pythonhosted.org/packages/fe/78/3a18a4a8a24a3fa5ca34ff3b0e855c19503dc6fb625b75a83bc17e4817e3/numpy-1.21.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl ](https://files.pythonhosted.org/packages/7a/4c/dd00ce768b0f0f7de5c486cbd9f5b922bc3af2f3a5da30121d7f7dc03130/numpy-1.21.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl ](https://files.pythonhosted.org/packages/01/c5/3ac36428af637b48236a389aca0e39896dd66477d759f6831a593d56d248/numpy-1.21.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-win32.whl ](https://files.pythonhosted.org/packages/a8/c5/cd1d947f68d7ec6ecdd5fbf651d7b0123a8b403b0b919f537b230ccd8582/numpy-1.21.2-cp39-cp39-win32.whl) | Wheel     | cp39           |
| [numpy-1.21.2-cp39-cp39-win_amd64.whl ](https://files.pythonhosted.org/packages/01/d9/6e5f6cbd9d1fc90c6c8d96e70754700ed6f93f90f321f887a3f26bf65715/numpy-1.21.2-cp39-cp39-win_amd64.whl) | Wheel     | cp39           |
| [numpy-1.21.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl ](https://files.pythonhosted.org/packages/2c/44/4210d16af96fe03f41c64bac2146435dc521a6e0457fdb3b5d15e1844578/numpy-1.21.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl) | Wheel     | pp37           |
| [numpy-1.21.2.zip ](https://files.pythonhosted.org/packages/3a/be/650f9c091ef71cb01d735775d554e068752d3ff63d7943b26316dc401749/numpy-1.21.2.zip) | Source    | None           |

これは、いったいどういうことなのでしょうか。

実は、pipにはパッケージング方法が複数定義されており、パッケージを公開する人が任意に選択できるのです。

pythonのコード(.py)をパッケージングする方式には、sdist方式とwheel方式があります。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114392/13aaeb26-5eec-2ff2-89ed-b8ff9d315403.png)
> 
> 出典：https://packaging.python.org/overview/

### sdist 方式

sdist方式は、ソースコードをzipファイルで圧縮したファイルを提供する方式です。

sdistパッケージは、`pip install`実行時に自動的にコンパイルされます。このときコンパイル環境の設定

### wheel 方式

wheelパッケージは、コンパイル済のパッケージです。

wheelパッケージの命名規則は次のように定義されています。

> {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl.
> 
> 
> - distribution
>    - Distribution name, e.g. 'django', 'pyramid'.
> - version
>   - Distribution version, e.g. 1.0.
> - build tag
>   - Optional build number. Must start with a digit. A tie breaker if two wheels have the same version. Sort as the empty string if unspecified, else sort the initial digits as a number, and the remainder lexicographically.
> - language implementation and version tag
>   - E.g. 'py27', 'py2', 'py3'.
> - abi tag
>   - E.g. 'cp33m', 'abi3', 'none'.
> - platform tag
>   - E.g. 'linux_x86_64', 'any'.
> 
> 出典：https://www.python.org/dev/peps/pep-0491/

要するに、wheelはパッケージを作成した環境に依存します。

### まとめ

どの種類のパッケージを公開するかは、パッケージ公開者が任意に選択できます。

`pip install`コマンドは、次の優先順位でインストールするパッケージを選択します。

1. 実行環境に適したwheelパッケージ
1. sdistパッケージ

### pip downloadの仕組み

pipにはパッケージをインストールせず、ダウンロードだけするサブコマンド`pip download`が用意されています。

https://pip.pypa.io/en/stable/cli/pip_download/

このコマンドはデフォルトでは、実行した環境に適したパッケージをダウンロードします。

たとえば、Ubuntu 20.04、python3.8の環境でnumpyをダウンロードすると、

```bash
$ pip download -d dest numpy
  Downloading .../numpy/1.21.2/numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.8 MB)
     |████████████████████████████████| 15.8 MB 92.1 MB/s 
  Saved ./dest/numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Successfully downloaded numpy
```

自動的に、`numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl`がダウンロードされます。

異なる実行環境用のパッケージをダウンロードする場合には、オプションで適切に指定する必要が有ります。

たとえば、Mac OSX用のpython2.7のパッケージをダウンロードする場合には以下のようなコマンドを実行します。

```bash
python -m pip download \
   --only-binary=:all: \
   --platform macosx-10_10_x86_64 \
   --python-version 27 \
   --implementation cp \
   SomePackage
```

このとき、Mac OSX用のパッケージがPyPIに存在しない場合、`pip`コマンドはエラーを返します。

# 手順

TBD

<!--

1. pythonのバージョン
1. OSの種類とバージョン

## オフライン環境とオンライン環境が同じ場合

### オフライン


```bash
pip download -d dest <package name>
```

```bash
$ pip download -d dest numpy
Looking in indexes: http://monster/nexus/repository/pypi/simple
Collecting numpy
  Downloading http://monster/nexus/repository/pypi/packages/numpy/1.21.2/numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (15.8 MB)
     |████████████████████████████████| 15.8 MB 92.1 MB/s 
  Saved ./dest/numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Successfully downloaded numpy
kannkyo@monster:/mnt/home/kannkyo/git/gitlab/test/obox$ tree dest
dest
└── numpy-1.21.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl

0 directories, 1 file
kannkyo@monster:/mnt/home/kannkyo/git/gitlab/test/obox$ 
```

### オンライン
-->