😎

ローカルインポートでの「pip install」(オフライン端末へ)

に公開

インターネット接続がないオフライン端末への「pip install」

オンライン端末(インターネット環境あり)
で、requirements.txtの内容で、pip installしたバイナリをダウンロードしておく
「wheels」という名前のフォルダにダウンロード

その後、「wheels」フォルダを丸ごと、USBメモリなどで、
オフライン端末(インターネット環境なし)
で、コピーして、
その「wheels」フォルダから読み込む形で、「pip install」する方法が記述されています。

前提として、
https://www.python.org/downloads/windows/

などで、ダウンロードしたものをオフライン端末側に持って行って
Python本体をインストールしておく必要あります

そのときに、
オンライン端末側で、pip installしたバイナリをダウンロードしておく
「wheels」という名前のフォルダにダウンロードの行為を行うときに、
見えてるPython本体のバージョン
と、
オフライン端末側で、「wheels」という名前のフォルダから読み込み時に、
見えてるPython本体のバージョンは、あわせておくほうがよい。

このとき、
★★★★★★★★★★★★★★★★★★★★★★
オンライン側が開発機で、miseでインストールしたPython本体でも、
オフライン側がターゲット機で、普通にインストールしたPythonの本体の
構成でもPythonの本体のバージョンが一致なら、問題なしです
★★★★★★★★★★★★★★★★★★★★★★

https://zenn.dev/tazzae999jp/articles/a645ec56ea8613
miseについては、こちら。

一応、wheelsフォルダには、バイナリイメージが入るため
OSや、x64などのCPUアーキテクチャは一致している必要あり
オンライン端末と、オフライン端末では、
Windows 11 端末同士であれば、windows11内での細かなバージョン違いはOK
Python本体のインストール場所が違っていてもOK

追記、下記のオンライン端末側とオフライン端末側では、requirements.txtが一致が必要かと思います

requirements.txtの中身一致は必要かと思います。
原理的に、考えても、そうだと思う。

詳細は、複雑なので割愛するが、「pip」でなく「python -m pip」や「python3 -m pip」にしとかないとエラーになることがあるとのこと

実際にエラーが起きて調べた結果の解決策です
ですので、
後述の記載事項をすべて、書き直していきました

「pip」でなく「python -m pip」
WSL2では、
「pip」でなく「python3 -m pip」

こうすべきなのは、miseの本体を使ってる場合
pipの見るべきものがずれるため
そのズレを防止するため

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
それから、オンライン端末と、オフラインのうち、
いずれか、一方が、miseのpython本体にするならば、
両方、miseの本体にしなければ、うまくいかない
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

もし、オンライン、オフラインがどちらも、
普通にPCにインストールしただけのPythonで、Windows版ならば(WSL2はまた違う)
「python -m pip」、「python3 -m pip」にしなくても
「pip」でいいのである

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
<結論>
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
しかし、こんな条件、ややこしすぎるため
もう、シンプルに、Windows側も、WSL2側も
オンライン端末側も、オフライン端末側も、
miseでの本体のPythonに統一して、
pythonとpython3の違いとか、\と、/の違いはあるけど
そこだけは、受け入れ、後は、一択のやり方でする
としたほうが、シンプルでわかりやすいだろう
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
<結論:その2>
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
ただし、オフライン側に「mise」をインストールできない場合は、
オンライン側も、オフライン側も、本体のPythonは、PCに直インストールしたものを
使う方向性であわせて、その場合は、
「pip」でなく「python -m pip」
WSL2では、
「pip」でなく「python3 -m pip」
しないで、
普通に、「pip」を使った方式で、すればよい
その場合は、
後続の記述の
「python -m pip」になってるところは、「pip」
「python3 -m pip」になってるところは、「pip」
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

「pip」か「 「python -m pip」 or 「python3 -m pip」 」をどちらを使うべきか迷ったら

★★★★★★★★★★★★★★★★★★★★★★★★★
最終結論 追記)
★★★★★★★★★★★★★★★★★★★★★★★★★
「pip」か「 「python -m pip」 or 「python3 -m pip」 」
のどちらを使うべきか、迷ったら

pip --version

python -m pip --version
または
python3 -m pip --version

のうち、バージョンが高い方法を
選べばよいのではないか
★★★★★★★★★★★★★★★★★★★★★★★★★

https://zenn.dev/tazzae999jp/articles/ed16c0ec8bc171
も、参考に

オンライン端末側

オンライン端末(インターネットにつながる端末)で、

python -m pip download -r requirements.txt -d wheels

WSL2では、
python3 -m pip download -r requirements.txt -d wheels

別にvenvに入らなくても、どこでも、
どのフォルダでも、pipコマンドさえ使える場所で、
requirements.txtがあれば実行可能。

この時に、オンライン端末でこのコマンドを打ち込むフォルダで
python3 -V( windows なら、python -V か)を打ち込んだときに
表示されるバージョンと、

オフライン側の、それとバージョンが一致しておればよい
pythonの実態のパスまでが同じである必要はない

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
★ 注意:.whlがPyPIに公開なしの理由で、.tar.gzが落ちてきたものは、.whlを作る必要あり
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
requirements.txt
の中にあるものの中で、PyPIに
.whlが公開されていないことが原因で
*.whlがダウンロードされず、代わりに
.tar.gzがダウンロードされたものがありました。
そういうものがないかを、wheelsフォルダの中を見て、確認する必要があります。
もし、そういうものがあれば、下記のコマンドで、
個別に、それだけ、
.tar.gzを元にして、.whlを作成する必要があります。
なぜなら、
requirements.txt
に定義がある分、全て、
.whlがある状況でないと、
オフライン端末側で取込インストール時にエラーになってしまうからです

例として、
odfpy-1.4.1.tar.gz
というのが、
一個だけ、それだった事象が起きた。
( 複数あるなら、その分、1個1個、対応の必要あり )

Windows(Git Bash)
python  -m pip wheel odfpy==1.4.1 -w wheels

WSL2
python3 -m pip wheel odfpy==1.4.1 -w wheels

なお、
odfpy==1.4.1
の部分は、requirements.txt から該当に記述をコピーしてくること。

にて、
odfpy-1.4.1-py2.py3-none-any.whl
が作成されました。

このようにして、PyPIにwhl版が無いという理由で、
*.tar.gzが落ちてきたものがあるかどうかを確認し
もし、あれば、有る分、一個一個、上記の要領で
.whlを作って、
requirements.txt にある分、すべて、
.whlがありますよ
状態にしてから、そのwheelsをオフライン端末側に持って行くべきなのである。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

オフライン端末側

USBメモリなどで、wheelsフォルダ丸ごとコピーしてきて

python -m venv .venv
( WSL2の場合は、python3 -m venv .venv )

「.venv」は仮想環境のフォルダ名なのでアプリで決めたフォルダ名
特にこだわりなければ、「.venv」でよいと思うが、決まった名前があればそれに従う。

.venv\Scripts\activate (windowsの直の場合)
> ちなみに、
> Git bashなら source .venv\Scripts\activate 
> WSL2なら source .venv\bin\activate
にて、仮想環境にactivateした後、
python -m pip install --no-index --find-links=.\wheels -r requirements.txt
( Git bash、WSL2の場合は、--find-links=./wheels )
WSL2では、
python3 -m pip install --no-index --find-links=./wheels -r requirements.txt

--no-indexは、PyPIからのダウンロードをしないという意味

Discussion