LoginSignup
3
1

More than 1 year has passed since last update.

自分で作ったpythonモジュールをpoetryでパッケージ化する

Posted at
  • ちょくちょく使うpythonモジュールをパッケージ化してpip installしておくとpythonモジュールの場所を意識せずに実行できるので便利。
  • 下記の記事で作ったCSVをJSONに変換するモジュールをパッケージ化する。
  • 既存のモジュールをパッケージ化する場合は poetry initすることもできるが、今回はpoetry newしたところに作成したモジュールを配置する。
  • poetry はpip installしておくこと pip install poetry

poetry addでパッケージディレクトリ作成

引数には最終的なパッケージ名にしておくとよい。

% poetry new csv2json
Created package csv2json in csv2json

下記のような構成でディレクトリやファイルが作成される。

current_dir
|--csv2json
|  |--README.rst
|  |--csv2json
|  |  |--__init__.py
|  |--pyproject.toml
|  |--tests
|  |  |--__init__.py
|  |  |--test_csv2json.py

個々のファイルの説明は省略、公式ドキュメント参照

pythonモジュール配置

Users/k-aido/work/python/hoge
|--csv2json
|  |--README.rst
|  |--csv2json
|  |  |--__init__.py
|  |  |--csv2json.py # 追加
|  |--pyproject.toml
|  |--tests
|  |  |--__init__.py
|  |  |--test_csv2json.py

pyproject.toml更新

下記について更新を行う。

  • 依存パッケージの追加
  • 実行コマンドを定義

初期状態

[tool.poetry]
name = "csv2json"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.8"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

依存パッケージの追加

今回のモジュールは引数の制御にclickを使っているのでこれを追加する。
流れとしては下記。

  1. poetry searchでパッケージ名を検索
  2. poetry addで追加

モジュール名がわかっていれば、pyproject.tomlを直接更新してもOK

% poetry search click

click8 (8.0.1)
 Composable command line interface toolkit

click (8.0.3) # 今回使うのはこちら
 Composable command line interface toolkit

click-repl (0.2.0)
 REPL plugin for Click

click-uwescience (7.0.1)
 A simple wrapper around optparse for powerful command line utilities.

click-aliases (1.0.1)
 Enable aliases for Click

click-utils (0.2.1)
 a set of utilites for writing command line programs with Click

click-shell (2.1)
 An extension to click that easily turns your click app into a shell utility

click-restful (0.0.1)
 Turn Click CLIs into Flask RESTful APIs.

click-lock (0.6)
 Adds locks and timeouts to click entrypoints

click-configfile (0.2.3)
 This package supports click commands that use configuration files.

click-frame (0.1)

docusign-click (1.0.0)
 DocuSign Click API

click-easylog (0.1.0)

click-plus (0.0.3)
 collection of click extensions

click-params (0.1.2)
 A bunch of useful click parameter types

click-stream (0.0.10)
 Click option type for http/https/file inputs

click-demo (0.2.0)
 Click commands Implementation along with Test cases

sphinx-click (3.0.1)
 Sphinx extension that automatically documents click applications

pytest-click (1.0.2)
 Py.test plugin for Click

types-click (7.1.7)
 Typing stubs for click
% poetry add click
Creating virtualenv csv2json-OWomnvc1-py3.8 in /Users/k-aido/Library/Caches/pypoetry/virtualenvs
Using version ^8.0.3 for click

Updating dependencies
Resolving dependencies... (0.9s)

Writing lock file

Package operations: 9 installs, 0 updates, 0 removals

  • Installing pyparsing (2.4.7)
  • Installing attrs (21.2.0)
  • Installing more-itertools (8.10.0)
  • Installing packaging (21.0)
  • Installing pluggy (0.13.1)
  • Installing py (1.10.0)
  • Installing wcwidth (0.2.5)
  • Installing click (8.0.3)
  • Installing pytest (5.4.3)

実施後

[tool.poetry]
name = "csv2json"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.8"
click = "^8.0.3" # 追加された

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

これでこのパッケージをインストールした際に、一緒にclickがインストールされる。

実行コマンドを定義

コマンド名 = 'tomlから見た.pyファイル:関数名'

[tool.poetry.scripts]
csv2json = 'csv2json.csv2json:main'

ビルド

  • poetry buildコマンドでビルドする。
  • -f を指定すると、tar.gz形式か、whl形式かを選べる。使い分けについてはわからず。別途調べる。
% poetry build
Building csv2json (0.1.0)
  - Building sdist
  - Built csv2json-0.1.0.tar.gz
  - Building wheel
  - Built csv2json-0.1.0-py3-none-any.whl

インストールしてみる

ビルドで作成したファイルを指定してpip installすることが可能。

% pip uninstall csv2json
Found existing installation: csv2json 0.1.0
Uninstalling csv2json-0.1.0:
  Would remove:
    /Users/k-aido/Library/Python/3.8/bin/csv2json
    /Users/k-aido/Library/Python/3.8/lib/python/site-packages/csv2json-0.1.0.dist-info/*
    /Users/k-aido/Library/Python/3.8/lib/python/site-packages/csv2json/*
Proceed (Y/n)? Y
  Successfully uninstalled csv2json-0.1.0
k-aido@k-aidonoMacBook-Air csv2json % pip install ./dist/csv2json-0.1.0-py3-none-any.whl
Defaulting to user installation because normal site-packages is not writeable
Processing ./dist/csv2json-0.1.0-py3-none-any.whl
Requirement already satisfied: click<9.0.0,>=8.0.3 in /Users/k-aido/Library/Python/3.8/lib/python/site-packages (from csv2json==0.1.0) (8.0.3)
Installing collected packages: csv2json
Successfully installed csv2json-0.1.0

インストールされた。

% pip list | grep csv2json
csv2json                          0.1.0

こんな感じで使える。

% csv2json sample.csv -o output.json

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1