【Python】オフライン環境下で pip install するには

■ はじめに

https://dk521123.hatenablog.com/entry/2021/07/08/161406
https://dk521123.hatenablog.com/entry/2021/07/09/115553

で 外部ネットワーク が繋がらない状態で、
個別で pip install とした際に、依存するパッケージを先に
入れておかなくてはならない。

そのため、インストール順番を間違えた場合、
エラーになってしまうが、調べていたら、
オフライン環境下での pip install があったのでメモしておく

 これがあれば、依存パッケージを適切に配置しておけば
インストール側は、1回のコマンド実行でよく、
依存パッケージを意識する必要がなくなる。

目次

【1】オフライン環境下での pip install
 1)--no-index
 2)-f, --find-links <url>
【2】インストール手順例
 1)対象モジュールをダウンロードする
 2)対象モジュールを任意ディレクトリに置く
 3)pip install (--no-index / --find-links) でインストールする
【3】おまけ:EMRのブートストラップアクションでの適用

【1】オフライン環境下での pip install

pip install --no-index --find-links=[ローカルディレクトリ先] [パッケージ名]

1)--no-index

https://kurozumi.github.io/pip/reference/pip_wheel.html#no-index

Ignore package index (only looking at --find-links URLs instead).

パッケージインデックスを無視する
(代わりに--find-linksのURLだけを見る)

2)-f, --find-links

https://kurozumi.github.io/pip/reference/pip_wheel.html#find-links

If a url or path to an html file,
 then parse for links to archives.
もし、URL又はHTMLファイルを指定した場合
その際は、アーカイブするためにリンクをパースする

If a local path or file:// url that's a directory,
 then look for archives in the directory listing.
もし、ローカルパス又はfile://<ディレクトリ> を指定した場合
その際は、ディレクトリリスト内でアーカイブを探す

【2】インストール手順

1)対象モジュールをダウンロードする
2)対象モジュールを任意ディレクトリに置く
3)pip install (--no-index / --find-links) でインストールする

開発環境

* OS : Windwos10
* Python : v3.6.13

1)対象モジュールをダウンロードする

対象モジュールおよび依存パッケージを含めて
モジュール(tar.gz形式 又は whl形式)をダウンロードしておく
 => 今回は、tar.gz形式

boto3パッケージ

[1] boto3
 => 今回の場合、「boto3-1.17.109.tar.gz」

https://pypi.org/project/boto3/

boto3に必要な依存パッケージ

[2] python-dateutil
 => 今回の場合、「python-dateutil-2.8.1.tar.gz」

https://pypi.org/project/python-dateutil/

[3] urllib3
 => 今回の場合、「urllib3-1.26.6.tar.gz」

https://pypi.org/project/urllib3/

[4] botocore
 => 今回の場合、「botocore-1.20.109.tar.gz」

https://pypi.org/project/botocore/

[5] s3transfer
 => 今回の場合、「s3transfer-0.4.2.tar.gz」

https://pypi.org/project/s3transfer/

[6] jmespath
 => 今回の場合、「jmespath-0.10.0.tar.gz」

https://pypi.org/project/jmespath/

2)対象モジュールを任意ディレクトリに置く

依存パッケージも含めて、任意ディレクトリ内に
tar.gz形式 又は whl形式のモジュールファイルを置く
 => 今回は、tar.gz形式

格納例

C:\tmp\pip_local\local_modules
 + boto3-1.17.109.tar.gz
 + python-dateutil-2.8.1.tar.gz
 + urllib3-1.26.6.tar.gz
 + botocore-1.20.109.tar.gz
 + s3transfer-0.4.2.tar.gz
 + jmespath-0.10.0.tar.gz

3)pip install (--no-index / --find-links) でインストールする

cd C:\tmp\pip_local

pip install --no-index --find-links=local_modules boto3

【3】おまけ:EMRのブートストラップアクションでの適用

https://dk521123.hatenablog.com/entry/2021/07/09/115553

での「install_boto3.sh (外部ネットワークに繋がる場合)」を
外部ネットワークに繋がらないように書き返てみる

サンプル:install_boto3.sh (外部ネットワークに繋がらない場合)

#!/bin/bash

INSTALL_MODULE_NAME="boto3"
DIR_NAME="local_modules"

# ディレクトリごとDownload する
aws s3 cp s3://your-bucket-name/xxx/${DIR_NAME} ./${DIR_NAME} --recursive

# pip install
sudo pip-3.6 install --no-index --find-links=${DIR_NAME} ${INSTALL_MODULE_NAME}

参考文献

https://gammasoft.jp/blog/pip-install-from-local-archives-by-manually/

関連記事

パッケージ管理 ~ pip / wheel, egg ~
https://dk521123.hatenablog.com/entry/2019/11/09/001342
pip に関するあれこれ
https://dk521123.hatenablog.com/entry/2021/07/02/000000
仮想環境 ~ pyenv / virtualenv / venv / pipenv ~
https://dk521123.hatenablog.com/entry/2020/02/11/141852
egg / wheel ファイルを作成する
https://dk521123.hatenablog.com/entry/2020/02/09/234350
pip install wheelファイル で Read time out が発生する
https://dk521123.hatenablog.com/entry/2021/07/08/161406
Amazon EMR ~ EMR内部 から SES で Email を送る ~
https://dk521123.hatenablog.com/entry/2021/07/09/115553