🌶️

Poetryで環境管理しているPythonアプリを、ネットワークが制限された環境にインストールする

2022/07/16に公開

この記事でやること

タイトル通りです。

  • Pythonでアプリを作った。
  • アプリの環境管理にはPoetryを使っている。
  • ネットワークに繋がらないPCでアプリを動かしたいと言われたので、頑張ってみた。

手順

前提

Poetryで下記の設定を入れている前提とします。

poetry config virtualenvs.create true
poetry config virtualenvs.in-project true

要するに、プロジェクト直下に.venvを作っている環境になります。
それ以外の場所に仮想環境を作っている場合はいい感じに読み替えてください。

準備するもの

  1. インストール先のネットワークに繋がらないPC
  2. 1のPCと同等環境のインターネットに繋がるPC
    • インストールするパッケージ(.whlファイル)をダウンロードするのに使います
    • 1をWindows、2をMacでやったら失敗したので、少なこともOSは同じでないとダメです
    • CPUがIntelとAMDとかでもダメかもしれないので、極力近い環境を用意しましょう
  3. 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.txtrequirement.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.txtmodules_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.txtmodulesディレクトリをプロジェクト直下に置いてください。
  • 下記コマンドを実行して必要なモジュールをインストールしてください。
pip install --no-index --find-link modules -r requirement.txt

仮想環境から出る

入ったままでも良いですが、一応出ておきましょう

exit

以上で、インストール完了です。
アプリが普通に動くようになるはずです。

簡単な解説

  • 手順を見て頂ければ分かりますが、Poetryで管理しているアプリなのに、インストールは全てpipで実施しています
  • これは、poetry install--find-linkオプションに対応していない為です。
  • つまり、poetry.whlファイルからのオフラインインストールに対応していません。
  • ですので、仮想環境に直接入りpipでインストールしています。

正直、せっかくPoetryで環境管理してるのになぁ、、、という思いしか無いです。
そもそも実運用中は切断するとしても、セットアップの時くらいはインターネットに繋いだほうがよくないですか?
それか、全てインストール済のDockerイメージとかを作りませんか?

Discussion