【備忘録】pip installが使えないときにローカルでPythonライブラリをインストールする

# 背景
Pythonで開発をしていたところ、pandasライブラリが必要になったので、コマンドプロンプトにて`pip install pandas`を実行しました。すると、以下のようなエラーを吐きました。
```:pip install pandasのエラー
$> pip install pandas
WARNING: REtrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 407 Proxy Authentication Required',))': /simple/pip/
WARNING: REtrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 407 Proxy Authentication Required',))': /simple/pip/
WARNING: REtrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 407 Proxy Authentication Required',))': /simple/pip/
WARNING: REtrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 407 Proxy Authentication Required',))': /simple/pip/
WARNING: REtrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', error('Tunnel connection failed: 407 Proxy Authentication Required',))': /simple/pip/
ERROR: Could not find a version that satisfies the requirement pandas (from versions: none)
ERROR: No matching distribution found for pandas
```
`pip install`は**インターネット**(PyPI)から自動でライブラリを取ってきてインストールしてくれるコマンドです。
インターネットからファイルを持ってこようとしたときに、コマンドの実行がプロキシに阻まれてしまったようです。

会社のプロキシサーバーからインターネットに接続している環境では稀によくあるケースのようで、プロキシを`set HTTPS_PROXY = http://ProxyServerIP:Port`などで設定できれば直で解決できるようですが、今回はプロキシを通すアプローチはできませんでした。

そこで私はPyPIからライブラリのインストール用ファイルをダウンロードしにいって、ローカルでインストールする手法を取りました(本題)。

# 結論
お急ぎの方のために解決法を先に記述しておきます。
1. [PyPI](https://pypi.org/)から必要なライブラリのソースファイル(Source Distribution)とビルト済みファイル(Built Distribution)をダウンロードする
2. ダウンロードしたディレクトリの1つ上の階層で以下を実行する
```
py -m pip install --no-index --find-links=package-name package-name
```

# 手順
PyPIからライブラリのディストリビューションをダウンロードし、ローカルでインストールする手法について具体的な手順を記述します。
今回はpandasをインストールするという想定で記述していきます。

※[ローカルインストールに関する公式アーティクル](https://packaging.python.org/en/latest/tutorials/installing-packages/)

今回の環境は以下の通りです。
|#|バージョン|
|:---|:---|
|OS|Windows 10 64bit|
|Python|3.10.3|
|pip|22.0.4|
|setuptools|68.1.2|

## 1.PyPIにpandasのディストリビューションを拾いに行く
PyPI(Python Package Index)とは、Pythonのライブラリがたくさん置いてあるリポジトリです。
ふだん`pip download`や`pip install`を実行するとき、`pip`はこのDBを参照しに行っています。

見に行ってもらったらわかりますが、PyPIではかんたんに手動でディストリビューションをダウンロードすることができます。
今回はpandasが目標なので、検索欄にpandasと入力していきます。
検索結果から、バージョン番号などをよく見て必要なものを選びます。
今回は2023/06/29にリリースされている[pandas 2.0.3](https://pypi.org/project/pandas/)を選択しました。
注※Pythonのバージョンごとに使えるライブラリのバージョンが異なってくるので確認が必要

pandas 2.0.3を開くと、pandasのかわいいロゴとともにプロジェクトの説明が現れます。
画面左のナビゲーション欄から、ファイルのダウンロードに進むことができます。
![PyPIのpandasのページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538332/dfcd96f5-a09c-a005-b9b8-086a08ef3d8b.png)

ここで知っておきたいのが、必要なディストリビューションについて。
Pythonのライブラリをインストールするには、ソースファイルとビルト済みファイルが必要です。これらについての詳しい説明は本記事では割愛します。
PyPI上ではだいたい以下の形式で落ちてます。
- ソースファイル : tar.gzファイル
- ビルト済みファイル : whlファイル

***
#### whlファイルの選び方
pandas 2.0.3もそうですが、whlファイルが複数置いてある場合があります。
どれを選べばいいの？となったので、補足説明として選び方を書いておきます。

まずpandas 2.0.3の場合では`cp311`とか`cp39`というのが見えると思います。
この数字はそれぞれPythonのバージョンを表しており、cp311ならPython 3.11.*、cp39ならPython 3.9.*を意味します。
つまり、自分のPythonバージョンに合致するwhlファイルを選べばいいわけです。
`win_amd64`とか`macos_11_0_arm64`とかは説明するまでもないと思うので割愛します。

ちなみに、Built Distributionが1つしかない場合があります。
これもファイル名を見ると`*-py2.py3-none-any.whl`となっていて、Python2とかPython3ならどれも対応してるよ！とわかります。すごいですね。

自分のPythonのバージョンに合致するwhlファイルがない場合は、そのライブラリはそのバージョンのPythonに対応していません。Pythonをアップグレードかダウングレードしましょう。
実はPyPIの画面左のメタデータ欄に必須Pythonバージョンが書いてあったりもします。
***
ここまでで2つのディストリビューションファイルをダウンロードすることができましたが、格納場所にもコツがあります。
以下のことを守って格納してください。
- コマンドプロンプトで実行できるディレクトリであること
- .tar.gzと.whlを格納するフォルダに別のファイルがないこと

2点目は必須ではない(と思います)が、こうしておいたほうがインストールするときに楽です。また本記事ではこのように保存した前提で進めていきます。
![ディストリビューションの格納](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538332/36e5ef67-2dfb-8a9c-9c53-e4610272ab51.png)
~~Windows11の批判はやめてください~~

## 2.ライブラリをインストールする
ディストリビューションファイルを準備できたので、いよいよライブラリをインストールできます。
まずは、コマンドプロンプト(ターミナル)でディストリビューションファイルを置いたディレクトリの**1つ上の階層**に移動します。
※エクスプローラーのパスの欄に`cmd`と入力すると表示しているディレクトリでコマンドプロンプトが開きます。
では、インストールするコマンドを実行していきます。
```
py -m pip install --no-index --find-links=pandas pandas
```
解説を入れておきます。
- `py -m` : Pythonのパスが通っていなくても実行できる
- `--no-index` : パッケージインデックスを無視する
- `--find-links` : 指定されたURLまたはディレクトリから必要ファイルを探す

`--no-index`と`--find-links`を組み合わせることでオフラインでのインストールを可能にしています。ここで格納方法のコツが活きてくるわけですね。

## 4.pandasのインストールにあたって発生したトラブルと対応(備忘録)
Successfully installedと表示されればインストール完了です。お疲れ様でした。
今回の私の環境ではここでも失敗がいくつかあったためさらに記述していきます。

まず、上記コマンドを実行したところ、setuptoolsのバージョンが足りないよ！と言われました。
Python3.10.3のデフォルトではsetuptoolsのバージョンは58.1.0ですが、pandasをインストールするためにはsetuptools 61.0.0異常が必要との旨のエラーが発生しました。
そこで、`pip install -U setuptools`を……というわけには当然いかず、setuptoolsもPyPIから落としてきてインストールしました。

上記手順と同様に.tar.gzと.whlをsetuptoolsと名付けたフォルダに保存し、`py -m pip install -U --no-index --find-links=setuptools setuptools`でインストール(アップデート)しました。
※`-U`オプションは`--upgrade`です。

setuptoolsも対応バージョンにアップデートできたし、いざpandasインストール！再びエラーを吐きました。
```:エラー内容
>py -m pip install --no-index --find-links=pandas pandas
Looking in links: pandas
Processing c:\users\test\desktop\test\pandas\pandas-1.4.1-cp310-cp310-win_amd64.whl
ERROR: Could not find a version that satisfies the requirement numpy>=1.21.0; python_version >= "3.10" (from pandas) (from versions: none)
ERROR: No matching distribution found for numpy>=1.21.0; python_version >= "3.10"
```
numpyが足りないぞと言われています。そう、pandasには依存しているライブラリがあります。
`pip install`であれば、依存するライブラリも一緒にインストールしてくれたりするんですが、やはりローカルでインストールを試みている以上、事前に依存ライブラリがなければインストールに失敗するみたいです。
参考までに、私の環境でpandasインストールするときに要求された各ライブラリとバージョンは以下です。
|ライブラリ名|バージョン|
|:--|:--|
|numpy|1.21.0|
|python-dateutil|2.8.2|
|pytz|2020.1|
|six|1.5|
|tzdata|2022.1|

これらのライブラリも同様にPyPIから落としてローカルでインストールしました。
ちなみに、python-dateutilはsixに依存しているのでpython-dateutilより先にsixをインストールする必要がありました。

# まとめ
今回は、`pip install`がネットワークの関係上使用できないときにローカルでPythonライブラリをインストールする方法について備忘録として記述しました。
プロキシを通せれば一番良かったのですが、自分でどうにかできないかと手法を探ってみました。`pip install`ないしは`pip download`が使えなくて困った場合に役に立てたら光栄です。
実は、pandasの依存ライブラリが不足しているとき、`py -m pip install 中略 pandas`を1度実行するたびに1つしか不足ライブラリを挙げてくれず、何度も`py -m pip install 中略 pandas`を実行して依存ライブラリが不足していると言われるというのを繰り返していました。先に依存ライブラリを調べてまとめてインストールすればよかったですね。

余談ですが、自作のライブラリをインストールするときにも今回の手法は応用できます。
ライブラリを自作するようなつよつよエンジニアには釈迦に説法な記事でしたが、最後までお読みいただきありがとうございました。