はじめに
前回pythonのサンプルプログラムを作成するためにpoetryを使用したが、あまりにも素人過ぎていろいろ雑だったのでもう少し調べる。
環境
Yocto Project VS Code連携機能を試す(C/C++)の環境を使用する。
poetryのプロジェクト
poetry
poetryはpipでインストールできる。
$ pip3 install --user poetry
下記の設定を行うことでプロジェクトごとにvirtualenv環境が作成される。 virtualenvに依存ライブラリなどをインストールした場合など、VS Codeなどで認識されるようになるらしい。
$ poetry config virtualenvs.in-project true --local
プロジェクト作成
poetry new
でプロジェクトを作成する。
$ poetry new hello $ cd hello
下記のようなツリーが作成される。
. ├── README.md ├── hello │ └── __init__.py ├── pyproject.toml └── tests └── __init__.py
pythonスクリプト
hello/main.py
を下記の内容で作成する。
def run(): print("Hello world!") if __name__ == '__main__': run()
ここではrun
関数がエントリポイントになるような構造にしている。
venvにパッケージをインストール
下記のコマンドを実行することでvirtualenv環境に作成中のプロジェクトをインストールすることができる。
$ poetry install
venvでスクリプトを実行
下記のコマンドでスクリプトをvirtualenv環境で実行できる。
$ poetry run python hello/main.py
下記のコマンドでvirtualenv環境に入ることもできる。
$ poetry shell
抜ける場合はexit
gitリポジトリ化
ローカルリポジトリ
下記のコマンドを実行し、gitリポジトリにする。
$ git init $ git add . $ git commit -m 'initial' $ git branch -m main
ベアリポジトリ
ベアリポジトリの作成
$ sudo mkdir -p /opt/repos/hello.git $ sudo chmod 777 /opt/repos/hello.git $ cd /opt/repos/hello.git $ git init --bare --shared
ベアリポジトリに登録
$ git remote add example ssh://localhost:/opt/repos/hello.git $ git push example main
レシピの作成
レシピを作成する。
workspaceへ展開
devtoolでベアリポジトリからworkspaceに展開する
$ devtool add ssh://localhost:/opt/repos/hello.git -B main
python3のパッケージなので、レシピ名はpython3-hello
となる。
パッケージをビルド
$ devtool build python3-hello
パッケージの内容
パッケージの内容を確認する。
$ pushd ./tmp/work/cortexa57-poky-linux/python3-hello/0.1.0+git/packages-split $ tree python3-hello
パッケージに収録されるファイル。
python3-hello └── usr └── lib └── python3.12 └── site-packages ├── hello │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-312.pyc │ │ └── main.cpython-312.pyc │ └── main.py └── hello-0.1.0.dist-info ├── METADATA ├── RECORD └── WHEEL
poetryで作成されたpythonプロジェクトがきちんと収録されている。
実行コマンド
pythonのパッケージをインストールすると例えば/usr/bin/hello
のように実行できるようなスクリプトがほしい。
poetryではそのようなスクリプトを自動生成することができる。
pyproject.tomlに下記の行を追加する。
[tool.poetry.scripts] hello = "hello.main:run"
下記のような書式となっている。
<コマンド名> = "<プロジェクト名>.<モジュール名>:<エントリポイント関数>"
パッケージの再確認
pyproject.tomlに[tool.poetry.scripts]
の内容を追加したあとパッケージを再ビルドする。
$ devtool build python3-hello
パッケージに収録されるファイル。
python3-hello └── usr ├── bin │ └── hello └── lib └── python3.12 └── site-packages ├── hello │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-312.pyc │ │ └── main.cpython-312.pyc │ └── main.py └── hello-0.1.0.dist-info ├── METADATA ├── RECORD ├── WHEEL └── entry_points.txt
レシピを全く変更していないのにusr/bin/hello
がきちんとパッケージに反映されている。
python_poetry_core.bbclass
が優秀なのでこのように追従してくれる。
レシピ
poetryのプロジェクトからdevtoolが作成したレシピは以下のような内容になっている。
LICENSE = "CLOSED" LIC_FILES_CHKSUM = "" SRC_URI = "git://localhost/opt/repos/hello.git;protocol=ssh;branch=main" # Modify these as desired PV = "0.1.0+git" SRCREV = "8c4d8e9fa6ed1bbe2417fd3afb935facbf19a2eb" S = "${WORKDIR}/git" inherit python_poetry_core
poetryのプロジェクトを作成時にライセンスをきちんと設定しなかったのでCLOSEDになっているが、 これはプロジェクト作成時に設定しておけば反映される。
レシピとしてはかなりシンプルで、タスクの定義は完全にpython_poetry_core.bbclass
にまかせている。
まとめ
poetryは優秀。それに対応するpython_poetry_core.bbclass
も優秀。