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のプロジェクトを作ったことになる。 このファイルの作り方については割愛。次のドキュメントに説明がある。
- Basic usage (python-poetry.org)
プロジェクトの依存関係のインストール
pyproject.tomlがあるディレクトリで
$ poetry install
を実行すると、pyproject.tomlに定義された依存パッケージがPoetryの作る仮想環境へインストールされる。仮想環境のパスについてはドキュメントを参照。このとき、poetry.lockがまだ無いなら作られる。既にあるならそのlockファイルにあるバージョンのパッケージがインストールされる。
pyproject.tomlやpoetry.lockが更新された時にはこのコマンドを再実行する必要がある。
- install (python-poetry.org)
仮想環境内の実行ファイルの実行方法
プロジェクトの仮想環境のbinディレクトリにプロジェクトで使用する実行ファイル(自分の作るアプリケーションなど)が配置される。ここにある実行ファイルを実行するにはpoetry runコマンドを使う。
例えば
$ poetry run pip list
とするとインストールされた依存パッケージと開発するアプリケーションが一覧表示される。
- run (python-poetry.org)
依存パッケージのバージョンアップ
$ poetry update パッケージ名
を実行すると、pyproject.tomlにある制約の範囲内で対象パッケージのバージョンが更新され、poetry.lockも更新される。 パッケージ名を指定しなければ全パッケージが更新される。
- update (python-poetry.org)
パッケージング
$ poetry build
を実行するとwheelパッケージを作れる。
- build (python-poetry.org)
バージョン取得
pyproject.toml内にはアプリケーションのバージョンが記載されているが、次のコマンドでこのバージョンを取得することができる。
$ poetry version -s 0.0.1
- version (python-poetry.org)
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」の値をメモリ使用量と考える方がいいらしい。
- 参考: 【RHEL】linuxメモリのfreeとmeminfoの関係を図解し利用率の計算方法を説明してみる (のぴぴのメモ)
であるならfreeコマンドのused欄にも total - available の値を表示すればいいのに、と思ったら最新のmanでは
used Used or unavailable memory (calculated as total - available)
と説明されていた。今年の六月に変更が入っており、procpsのバージョン4.0.1から変わっているようだ。
- doc: Note new Used behavour (procps-ng/procps)
- library: modify calculation of 'MEMINFO_MEM_USED' item (procps-ng/procps)
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になった所で止まっているように見える)が、原因はわからない。