【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】pip download(追加)
【3】インストール手順例
 1)対象モジュールをダウンロードする
 2)対象モジュールを任意ディレクトリに置く
 3)pip install (--no-index / --find-links) でインストールする
【3’】インストール手順例(Old)
 1)対象モジュールをダウンロードする
 2)対象モジュールを任意ディレクトリに置く
 3)pip install (--no-index / --find-links) でインストールする
【4】おまけ:EMRのブートストラップアクションでの適用

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

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

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

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だけを見る)

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】pip download(追加)

* パッケージのダウンロード
 => これで依存関係のライブラリも落としてこれる!

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

構文

pip download -d <dir> <package>

# こっちの方がDependencyを調べなくていいからいい!
pip download -d <dir> --no-binary :all: <package>

コマンド例1

$ pip download -d ./src -r requirements.txt
...
$ cd ~/src
$ ls
boto3-1.34.51-py3-none-any.whl     python_dateutil-2.8.2-py2.py3-none-any.whl  urllib3-2.0.7-py3-none-any.whl
botocore-1.34.51-py3-none-any.whl  s3transfer-0.10.0-py3-none-any.whl
jmespath-1.0.1-py3-none-any.whl    six-1.16.0-py2.py3-none-any.whl

requirements.txt

boto3
python-dateutil
urllib3
botocore
s3transfer
jmespath

コマンド例2

$ pip download -d src --no-binary :all: boto3

【3】インストール手順例

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

開発環境

* OS : Ubuntu
* Python : v3.6.13

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




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

格納例

~/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
pip install --no-index --find-links=local_modules boto3

参考文献
https://qiita.com/analytics-hiro/items/2565adbb2c900e6738cd
https://kazuhira-r.hatenablog.com/entry/2021/05/17/003204

【3’】インストール手順例(Old)

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
cd C:\tmp\pip_local

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

【4】おまけ: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
パッケージ配布 ~ setup.pyによる作成方法 ~
https://dk521123.hatenablog.com/entry/2024/03/19/000000
パッケージ配布 ~ pyproject.tomlによる作成方法 ~
https://dk521123.hatenablog.com/entry/2024/03/28/000000
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