メモの日々


2022年12月13日(火) [長年日記]

[python] Poetryの使い方メモ

PythonのパッケージングツールであるPoetryの使い方をメモ。使用するバージョンは1.3.1。

Poetryのインストール

ドキュメントにいくつかの方法が書かれているが、Manually (advenced) にあるvenvとpipを使った方法が分かりやすいと思う。

$ python3 -m venv $VENV_PATH
$ $VENV_PATH/bin/pip install -U pip setuptools
$ $VENV_PATH/bin/pip install poetry

VENV_PATHは任意のディレクトリを表す。上のようにした後、poetryコマンドの実体が $VENV_PATH/bin/poetry になるようにする(シンボリックリンクやシェルのaliasなどを使って)。

面倒ならvenvを使わずpipで普通にインストールしてもいいと思うけど。

プロジェクトの作成

pyproject.toml を用意すればPoetryのプロジェクトを作ったことになる。 このファイルの作り方については割愛。次のドキュメントに説明がある。

プロジェクトの依存関係のインストール

pyproject.tomlがあるディレクトリで

$ poetry install

を実行すると、pyproject.tomlに定義された依存パッケージがPoetryの作る仮想環境へインストールされる。仮想環境のパスについてはドキュメントを参照。このとき、poetry.lockがまだ無いなら作られる。既にあるならそのlockファイルにあるバージョンのパッケージがインストールされる。

pyproject.tomlやpoetry.lockが更新された時にはこのコマンドを再実行する必要がある。

仮想環境内の実行ファイルの実行方法

プロジェクトの仮想環境のbinディレクトリにプロジェクトで使用する実行ファイル(自分の作るアプリケーションなど)が配置される。ここにある実行ファイルを実行するにはpoetry runコマンドを使う。

例えば

$ poetry run pip list

とするとインストールされた依存パッケージと開発するアプリケーションが一覧表示される。

  • run (python-poetry.org)

依存パッケージのバージョンアップ

$ poetry update パッケージ名

を実行すると、pyproject.tomlにある制約の範囲内で対象パッケージのバージョンが更新され、poetry.lockも更新される。 パッケージ名を指定しなければ全パッケージが更新される。

パッケージング

$ poetry build

を実行するとwheelパッケージを作れる。

  • build (python-poetry.org)

バージョン取得

pyproject.toml内にはアプリケーションのバージョンが記載されているが、次のコマンドでこのバージョンを取得することができる。

$ poetry version -s
0.0.1

2022年12月30日(金) [長年日記]

[dev] Linuxでのメモリの使用量と空き容量

手元のLinux環境でfreeコマンドを実行すると次のように表示される。

% free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776   914223104 39214383104       65536   169709568 38992666624
Swap:    10737418240           0 10737418240

ここに表示されるusedの値は、この環境のfreeのmanに

       used   Used memory (calculated as total - free - buffers - cache)

と説明されており、確かにこの計算式の値になっている。

しかし、buffersやcacheの中には直ちには解放できない領域が含まれているようで、実際には「total - available」の値をメモリ使用量と考える方がいいらしい。

であるならfreeコマンドのused欄にも total - available の値を表示すればいいのに、と思ったら最新のmanでは

       used   Used or unavailable memory (calculated as total -
              available)

と説明されていた。今年の六月に変更が入っており、procpsのバージョン4.0.1から変わっているようだ。


2022年12月31日(土) [長年日記]

[dev][howto] メモリに負荷をかけるワンライナー

$ a=$(head --bytes 100M /dev/zero | cat -v)

これでシェル変数aに200MB分の文字列が設定され、同程度のメモリが消費される。cat -vが 0 を ^@ の2文字に変換するのでheadで指定した2倍の量になる。

が、bashだと想定通りに動くがzshだとメモリ使用量が多くなってしまう。

$ bash
$ free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776   954339328 39173054464       65536   170921984 38951944192
Swap:    10737418240           0 10737418240

$ a=$(head --bytes 100M /dev/zero | cat -v)
$ free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776  1165631488 38961754112       65536   170930176 38740647936
Swap:    10737418240           0 10737418240

$ unset a
$ free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776   955932672 39171452928       65536   170930176 38950346752
Swap:    10737418240           0 10737418240
$ zsh
% free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776   967888896 39159525376       65536   170901504 38938406912
Swap:    10737418240           0 10737418240

% a=$(head --bytes 100M /dev/zero | cat -v)
% free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776  1388785664 38738612224       65536   170917888 38517501952
Swap:    10737418240           0 10737418240

% unset a
% free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776  1177305088 38950068224       65536   170942464 38728966144
Swap:    10737418240           0 10737418240

% a=$(head --bytes 100M /dev/zero | cat -v)
% free -b
               total        used        free      shared  buff/cache   available
Mem:     40298315776  1386938368 38740426752       65536   170950656 38519332864
Swap:    10737418240           0 10737418240

zshだと、最初に400MB増えて、変数aを削除すると200MBだけ解放され、もう一度実行すると今度は200MB増える。

なお、手元の環境だとheadで指定するサイズを1Gにするとコマンドが返らなくなる。これはWSL上で実行しているために何かの制限に引っかかっているのかなと思っている(シェルのプロセスサイズが2GBになった所で止まっているように見える)が、原因はわからない。