Slide 1

Slide 1 text

データ分析ツール開発で poetryを使う選択肢 @PyCharity 2020-02-20 mizzsugar0425 1

Slide 2

Slide 2 text

自己紹介 ● みずきと申します。 ● Twitter → @mizzsugar0425 ● 普段はPythonを使ってWEBサービスの開発をしています。 ● Spready株式会社所属 ● myProduct株式会社で開発のお手伝いもしています。 ● 今回のお話はmyProduct株式会社での事例です。 ● 発表中のソースコードは、実際のプロジェクトで利用したものを一部改変していま す。 ● 分析の内容や手法の話はしません。 2

Slide 3

Slide 3 text

このLTで伝えたいこと ● 分析のソースコードをアプリケーションから独立させながらアプリケーションで使うに は、分析部分をパッケージにする手があります。 ● パッケージを作るなら、poetryを使うと楽です。 ● poetryで作った、PyPIにない自作パッケージを seup.pyやpoetryでインストールすることが出来ます。 3

Slide 4

Slide 4 text

開発の概要 前提: ● 分析ツールはコマンドラインおよびデスクトップで実行されていました。(CUIまたは GUIで実行する分析ツールを旧分析ツールと呼びます) ● データベースからのデータ抽出は手作業でした。 開発内容 ● 旧分析ツールを個人環境から独立して継続的に実行する分析ツールを新しくを開 発しました。(新分析ツールと呼びます) ● 新分析ツールはCRONで定期的に実行し、データ抽出からレポーティングまでを自 動化しました。 4

Slide 5

Slide 5 text

ディレクトリ構成 ── project ├── application (CRONやデータベースと接続する部分 ) │ ├── application │ │ ├── __init__.py │ ├── poetry.lock │ ├── pyproject.toml ├── analysis (分析部分) ├── analysis │ ├── __init__.py ├── poetry.lock └── pyproject.toml 5

Slide 6

Slide 6 text

project/application/application/__init__.py import pathlib import tempfile import analysis # 分析のパッケージ def report(parameter: analysis.Parameter) -> None: with tempfile.TemporaryDirectory() as d: input_data = ... # 分析対象となるデータを抽出する output_path = pathlib.Path(d) analysis.report(input_data, parameter, output_path) ... 6

Slide 7

Slide 7 text

poetryを使わないでパッケージを作る手順 ● setuptoolsを使います。 ● setup.pyまたは、setup.pyとsetup.cfgを書きます。 (時間の関係上、今回はsetup.pyとsetup.cfgを書く方法だけ紹介します。) 7

Slide 8

Slide 8 text

[setup.cfg版] analysisのディレクトリ構成 ├── analysis (分析部分) ├── analysis │ ├── __init__.py ├── setup.py └── setup.cfg 8

Slide 9

Slide 9 text

setup.cfg [metadata] name = analysis version = 1.0.0 description = this is a sample library long_description = README.rst license = BSD 3-Clause License [options] install_requires = pandas python_requires='>=3.7' [options.extras_require] develop = flake8 mypy 9 各 項 目 の 意 味 はこちら ↓ https://packaging.python.org/guides/distributing-packages-using-setuptools/

Slide 10

Slide 10 text

setup.py from setuptools import setup setup() 10

Slide 11

Slide 11 text

poetryを使うと楽に出来る pip install poetry poetry init 11 このコマンドを実行後、パッケージ作成に必要な情報を聞かれます。 poetryに沿って回答するだけで、setup.cfg相当のファイル「pyproject.toml」が 自動で生成されます。

Slide 12

Slide 12 text

pyproject.tomlとは ● PEP518で提案された、パッケージのビルドに必要なデータを定義するファイルの フォーマット ● seup.pyやsetup.cfgの機能を代替する、ファイルのフォーマット ● pyproject.tomlを使うか、setup.pyやsetup.cfgを使うかは パッケージングのためのツール(setuptoolsやpoetryなど)次第 12

Slide 13

Slide 13 text

$ poetry init This command will guide you through creating your pyproject.toml config. Package name [analysis]: analysis Version [0.1.0]: Description []: library for analysis Author [mizzsugar , n to skip]: mizzsugar License []: BSD-3-Clause Compatible Python versions [^3.8]: ^3.7 Would you like to define your main dependencies interactively? (yes/no) [yes] yes You can specify a package in the following forms: - A single name (requests) - A name and a constraint (requests@^2.23.0) - A git url (git+https://github.com/python-poetry/poetry.git) - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop) - A file path (../my-package/my-package.whl) - A directory (../my-package/) - A url (https://example.com/packages/my-package-0.1.0.tar.gz) Search for package to add (or leave blank to continue): pandas Adding pandas tqdm Add a package: Would you like to define your development dependencies interactively? (yes/no) [yes] no Generate 13 ※オレンジ色の枠は回答する箇所です。 poetry add [パッケージ名] で後から依存パッケージを 増やせます。

Slide 14

Slide 14 text

project/analysis/pyproject.toml [tool.poetry] name = "analysis" version = "0.1.0" description = "library for analysis" authors = ["mizzsugar "] [tool.poetry.dependencies] python = "^3.7" pandas = "^1.1.3" [build-system] requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" 14

Slide 15

Slide 15 text

pipを使ってanalysisをapplicationにインストール >> cd ~/project/application >> pip install ../analysis 15 ※ただし、pip install -e ../analysis を実行すると以下のエラーになります。 A "pyproject.toml" file was found, but editable mode currently requires a setup.py based build. 現段階では、pyproject.tomlは編集可能モードでのインストールを pipでサポートされていません。 (pipのバー ジョンが21.0.1時点の情報です) 編集可能モードでインストールしたい場合は、 applicationでもpoetryを使う必要があります。

Slide 16

Slide 16 text

poetryを使ってanalysisをapplicationにインストール >> # 既にapplication用のpyproject.tomlを作成済の前提です。 >> cd ~/project/application >> poetry add ../analysis # これでpip install -e 相当のインストールです。 16

Slide 17

Slide 17 text

project/application/pyproject.toml [tool.poetry] name = "application" version = "0.1.0" description = "" authors = ["mizzsugar"] [tool.poetry.dependencies] python = "^3.7" analysis = {path = "../analysis"} fastapi = {version = "^0.61.1"} uvicorn = {extras = ["standard"], version = "^0.12.2"} PyDrive = "^1.3.1" mysqlclient = "^2.0.1" [build-system] requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" https://python-poetry.org/docs/cli/ {path = "パス"} で指定したパスのパッケージを インストールします。 17

Slide 18

Slide 18 text

Poetryでパッケージ化して良かった点 ● setup.cfgを作らなくてよいのが楽でした。 (poetry init, poetry add するだけ!) ● 分析の要望がガラっと変わって新しいパッケージを作成した際に、 新旧パッケージがお互いにまったく依存しない状態に出来ました。 (applicationからimport analysisとしている箇所を消すだけ!) 18