🌶️
Poetryで環境管理しているPythonアプリを、ネットワークが制限された環境にインストールする
この記事でやること
タイトル通りです。
- Pythonでアプリを作った。
- アプリの環境管理にはPoetryを使っている。
- ネットワークに繋がらないPCでアプリを動かしたいと言われたので、頑張ってみた。
手順
前提
Poetryで下記の設定を入れている前提とします。
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
要するに、プロジェクト直下に.venv
を作っている環境になります。
それ以外の場所に仮想環境を作っている場合はいい感じに読み替えてください。
準備するもの
- インストール先のネットワークに繋がらないPC
- 1のPCと同等環境のインターネットに繋がるPC
- インストールするパッケージ(
.whl
ファイル)をダウンロードするのに使います - 1をWindows、2をMacでやったら失敗したので、少なこともOSは同じでないとダメです
- CPUがIntelとAMDとかでもダメかもしれないので、極力近い環境を用意しましょう
- インストールするパッケージ(
- PythonのOfflineインストーラー
- Python公式からダウンロードしておいてください。
- バージョンに気をつけましょう。アプリの
pyproject.toml
で指定しているはず
pyproject.toml
[tool.poetry.dependencies]
python = "^3.8,<3.9"
インターネットに繋がる環境で、必要なパッケージをダウンロードする
まずは、必要なものを集めます。
インターネットに繋がるPCで実施してください。
pythonアプリが動く状態にする
作ったpythonアプリが動く状態にしておいてください。
poetryをダウンロードする
- プロジェクト直下(
pyproject.toml
があるディレクトリ)に、下記内容のファイルをrequirement_poetry.txt
という名前で保存してください。- 自分が使っているpoetryのバージョンに書き換えてください。
requirement_poetry.txt
poetry==1.1.13
- 下記コマンドを実行して、poetryをダウンロードしてください。
pip download -d modules_poetry -r requirement_poetry.txt
-
modules_poetry
ディレクトリ配下にpoetryのインストールに必要な.whl
ファイルがダウンロードされます。
アプリに必要なパッケージをダウンロードする
- プロジェクト直下で下記コマンドを実行して、仮想環境に入ってください。
poetry shell
- 下記コマンドで、必要なパッケージの一覧を
requirement.txt
に書き出してください。
poetry export --without-hashes -o requirement.txt
- 下記コマンドを実行して、アプリに必要なパッケージをダウンロードしてください。
pip download -d modules -r requirement.txt
-
modules
ディレクトリ配下にアプリに必要なパッケージの.whl
ファイルがダウンロードされます。
これで、必要なものが集まりました。
必要なものをインストール先のネットワークに繋がらないPCの持っていく
USBメモリとかで頑張って持っていってください。
- PythonのOfflineインストーラー
- アプリ本体
-
requirement_poetry.txt
とrequirement.txt
- プロジェクト直下に置いてください。
-
modules_poetry
ディレクトリとmodules
ディレクトリ(中身の.whl
ファイル含む)- プロジェクト直下に置いてください。
ネットワークに繋がらないPCにインストール
Pythonのインストール
Offlineインストーラーでインストールしてください。詳細は省略。
注意点として、Scripts
にもPathを通すのを忘れないでください。参考にWindowsでやった時に実際に通したPathを貼っておきます。
%USERPROFILE%\AppData\Local\Programs\Python\Python39\
%USERPROFILE%\AppData\Local\Programs\Python\Python39\Scripts\
Poetryのインストール
-
requirement_poetry.txt
とmodules_poetry
ディレクトリをプロジェクト直下に置いてください。 - 下記コマンドを実行してpoetryをインストールしてください。
pip install --no-index --find-link modules_poetry -r requirement_poetry.txt
poetryの設定
- 下記コマンドを実行して、前提に書いたpoetryの設定を入れておきます。
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
仮想環境に入る
- 下記コマンドを実行して、仮想環境に入ってください
- 最初は仮想環境が無いので、勝手に作られるはずです。
poetry shell
アプリに必要なパッケージのインストール
-
requirement.txt
とmodules
ディレクトリをプロジェクト直下に置いてください。 - 下記コマンドを実行して必要なモジュールをインストールしてください。
pip install --no-index --find-link modules -r requirement.txt
仮想環境から出る
入ったままでも良いですが、一応出ておきましょう
exit
以上で、インストール完了です。
アプリが普通に動くようになるはずです。
簡単な解説
- 手順を見て頂ければ分かりますが、
Poetry
で管理しているアプリなのに、インストールは全てpip
で実施しています - これは、
poetry install
が--find-link
オプションに対応していない為です。 - つまり、
poetry
は.whl
ファイルからのオフラインインストールに対応していません。 - ですので、仮想環境に直接入り
pip
でインストールしています。
正直、せっかくPoetryで環境管理してるのになぁ、、、という思いしか無いです。
そもそも実運用中は切断するとしても、セットアップの時くらいはインターネットに繋いだほうがよくないですか?
それか、全てインストール済のDockerイメージとかを作りませんか?
Discussion