HEADこの広告は、90日以上更新していないブログに表示しています。そのためいつもよりボリュームたっぷり、文体も丁寧にお送りします。adventar.org本記事ではPoetryを使ってパッケージ開発→PyPIへ登録するまでの流れを紹介します。100%new→build→publishの3コマンドでプロジェクト作成からPyPIに登録まで、約25秒ほどでした。(やったあとでTestPyPIの存在思い出したんですが、こういうテスト用途にはそちらを使いましょう...)実際にはパッケージのコードを書いたりテストコード書いたりが必要ですが、それ以外の諸々はPoetryがやってくれるので、本質的なコードを書くことに集中できます。ついて基本的な使い方Poetryの基本的な使い方については公式ドキュメントの他にも日本語で有用な記事がすでに2つありますのでそちらを紹介しておきます。PipenvPipenvは確かに便利だけどPythonのパッケージ管理ツールとしては最近ではPipenvが使われるようになってきていると思いますが、あちらはあくまでも依存関係の管理までです。Poetryはそれに加えてこうしたパッケージのビルドや公開までもが守備範囲となっています。先程紹介した記事によるとPipenvはちょっと雲行きが怪しい感じみたいです。当初大きな期待を持って迎えられましたが(私も期待しましたが)、さまざまな問題が出ており最近はどうも先行きが怪しい感じです。使っていなかったら抱えていなかった新たなストレスも増えた感じがします。」を検討している方にとって有力な移行先候補のひとつです。問題点とそれにまつわる議論については次のページ等が参考になります。興味のある方は読んでみてください。redditwww.lifewithpython.comPoetryのREADMEでもPipenvについて言及しています。それによるとPipenvで依存関係の解決に失敗するようなケースでもPoetryなら大丈夫とのこと。sdispater/poetryまたライブラリのインストールもPipenvは結構遅いですが、Poetryはだいぶましです。Pipほど速くはないですが...。Pipenvも良いツールだと思います。「これからの時代は何も考えずにとりあえずPipenvいれとけばいい」という状況ではないと思います。乗り換える先日書いた記事を参考にしてください。PipenvからPoetryへの移行が進行中のようです(現在のところは両方サポート)。こちらも参考になるでしょう。PyenvPoetryの作者自身、Pyenvと組み合わせて利用しているようです。Pyenvを使う場合はこんな感じでインストールすると良いでしょう。以下Issueのオーナーコメントより引用。pythongithub.comPyenvといえば日本人しか使ってないニッチなツールというイメージはもはや過去のものとなり、PipenvもPoetryもPyenvとの連携が想定されていますし、CircleCIも内部でPyenvを使っています。以前は僕もPyenvのハマりどころの多さに嫌気が差して使うのをやめていましたが、あれから徐々に海外でも知名度を上げコミットする人間も増えたみたいで、今では使っていても問題は特に起きないので日常的に使っています。いうパッケージ開発なんかでは細かいバージョン違いまで管理する必要がありますが、「これからPythonはじめたいのでPyenvいれてみるかー」みたいなのは避けたほうがいいです。Python2と3の使い分け程度ならhomebrewで十分ですし、Python3.6と3.7の使い分けとかも公式からバイナリ落としてきてそれぞれインストールすればいいだけです。「よくわからないけどとりあえずPyenvいれてみる」というケースが一番ハマるパターンだと思っています。PEP518www.python.orgPoetryにも使われているpyproject.tomlはPipfileのようなものですが、あちらが独自定義のファイルなのに対し、こちらはPEPで仕様が決められています。PEP518によると、pyproject.tomlでビルドツールを指定、もしそのツールが無ければsetuptoolsによるビルドが行われます。乗り換えたければここだけ直せば後の設定は一切書き換えること無くビルドツールを乗り換えることができる、というのが本来の目的だと思います。[tool.poetry]のようなPoetry独自設定を書き込まなければならないため、「一見PEPに従ってるように見えるが蓋を開けてみればまだまだPipfileと同じような独自定義の設定ファイル」となっています。対応しているflitも同様のようです。ビルドツール用の標準APIの仕様策定は、PEP517で行われています。www.python.orgPoetryもすでにPEP517に準拠しています。buildコマンドの追加へ向けてすでに動いているようです。github.com将来的にすべてがpipに収束するのかはわかりませんが、少なくともユースケースに応じて適切なツールを自由に選択できるようになっているんじゃないかと思います。個人的に仮想環境(venv)をプロジェクト内に作ってほしかったりするのでそれらの設定を先に行います。このあたりは必要に応じて行ってください。venvの作成先をプロジェクト内にしたいデフォルトだと仮想環境は、macだと$HOME/Library/Caches/pypoetry/virtualenvs以下に作られます。--listで確認できます。Support/pypoetry以下のconfig.tomlというファイルに記載されています。実行すると自動で作成されます。現状だとsettings.virtualenvs.in-projectがfalseなので、settings.virtualenvs.pathに設定されている"~/Library/Caches/pypoetry/virtualenvs"へ仮想環境が作られるようになっています。仮想環境をプロジェクト配下に作りたい場合は、以下のようにsettings.virtualenvs.in-projectにtrueを指定します。trueこれによりvirtualenvs.pathの設定は無視して各プロジェクト直下に仮想環境が作られるようになります。コマンドはデフォルトではPyPIへのアップロードになっています。練習なのでPyPIではなくTestPyPIのほうにアップロードできるように設定しましょう。リポジトリの設定から。XXXの部分に好きな名前を指定して、URLを紐づけます。ほうじゃないとダメです。(実は記事執筆時点の最新版のPoetryだと成功してる風な出力になりますが実際にはアップロードできてなくて、試しにtwineでアップロードしてみると405エラーになります。homepageの設定がないとアップロードできません。先ほどと同様Poetryだと成功しているように見えるんですが、twineでやってみるとHome-PageにNoneは設定できないよという感じのエラーが返ってきます。https://test.pypi.org/legacy/とりあえずIssueは出しておきました。オーナーからバグなので対処すると返事も来てました。github.comTestPyPIのユーザー名とパスワードを設定するpublishコマンドを実行すると通常は対話形式でログインのためにユーザー名とパスワードを要求されます。対話形式での入力以外の方法としては以下の2通りがあります。今回は後者を設定してみます。password以上です。PyPIの場合はこう。Support/pypoetry/auth.tomlに保存されています。twineの.pypircのようなものですね。そちら同様パスワードは平文で保存されてるので扱いには十分注意してください。あ、そもそもTestPyPIにアカウント登録していない場合はまずそちらを済ませておいてください。ここまでの設定ここまでで設定はこんな感じになりました。標準的なレイアウトそれではまずプロジェクトを作ってみます。newコマンドを実行します。howoldru作成されたプロジェクトの構成はこうなっています。files新規作成時点でのpyproject.tomlです。オプションを指定します。filessrcレイアウトの有効性についてはPytestの公式ドキュメントの翻訳記事があったのでこちらを参考にしてください。これだとちょっとした問題を引き起こす。それは、testsディレクトリからモジュールをロードするために、pytestがsys.pathの先頭にレポジトリのルートを追加するが、これがmypkgもインポート可能となるということを引き起こすからである。仮想環境においてパッケージをテストするためにtoxのようなツールを利用しているならば、これは問題となる。テストしたいのはインストールされたバージョンのパッケージであり、レポジトリのローカルコードではないからだ。このようなシチュエーションではsrcレイアウトを使用することが強く推奨される。initコマンドを使用します。パッケージ名やバージョンなどを対話形式で入力すると、その内容を元にpyproject.tomlを生成してくれます。[yes]newの場合はtool.poetry.dev-dependenciesに自動的にpytestが記載されていましたがこちらの場合はそれがないです。必要なライブラリのインストール今回は作ろうと思っているパッケージは、コマンドラインツールを簡単に実装できるfireと日時操作を簡単に行えるpendulumを使いますのでそれらをインストールします。インストールにはaddコマンドを使用します。コマンドを実行すると初回は自動的に仮想環境が作られます。続いてその環境に先程指定したパッケージがインストールされます。自ら追加したパッケージはpyproject.tomlに追記されています。ほうに記載されています。結構な行数なのでここでは割愛します。公開予定のプログラムを書く今回は1ファイルのみのコマンドラインツールを作ろうと思うので、howoldruパッケージは削除してhowoldru.pyを用意します。howoldru.pyhowoldru.pyはこんな感じで実装しました。print(f"あなたは現在{age}歳です。main()生年月日を入力すると現在の年齢を教えてくれるだけのコマンドラインツールです。動作確認してみましょう。pythonで仮想環境のほうのPythonが実行されます。2001-08-25あなたは現在17歳です。コマンドで実行できるようにしてみましょう。pyproject.tomlに以下の設定を追加します。howoldruコマンドが実行できるようになりました。2001-08-25あなたは現在17歳です。howoldruコマンドだけで済むようにしてみましょう。内容は読み込んでくれません。コマンドで仮想環境をactivateします。.venv/bin/activate.fishしたのと同じ状態になりました。shellを利用しています。bashやzshだと表示が若干違うと思いますが適宜読み替えてください。コマンドで開発途中のパッケージを仮想環境にインストールします。howoldruコマンドだけで実行できるようになりました。ディレクトリを探し、ビルドを行います。buildコマンドでパッケージをビルドする際にpyproject.tomlの内容に基づいてsetup.pyを自動生成してくれます。実際に確認してみましょう。howoldru-0.1.2-py3-none-any.whldist/以下にtar.gzとwhlファイルが作成されました。setup.py/setup.cfg/MANIFEST.inはもう書かなくて良い生成されたsetup.pyを確認してみます。howoldru-0.1.2/setup.py内容がこちら。'>=3.7,<4.0',}setup(**setup_kwargs)install_requiresやconsole_scriptsなんかもpyproject.tomlに基づいて自動的に設定してくれているのがわかると思います。setup.cfgやMANIFEST.inに書いていたような内容もpyproject.tomlがその役目を負ってくれているのでもう書く必要はありません。PyPIへの公開TestPyPIに公開するPyPI(TestPyPI)への公開はpublishコマンドで行います。ようにアップロード先を指定します。オプションを忘れるとPyPIのほうへアップロードされてしまうので注意。configコマンドでPyPIの認証情報を設定していない場合は、実行時にユーザー名とパスワードの入力を求められますので入力します。認証に成功すると先程ビルドしたものがPyPIへアップロードされます。100%PyPIの自身のプロジェクト一覧を見るとアップロードされているのが確認できると思います。https://pypi.org/manage/projects/パッケージのページもできてますね。TestPyPI付加情報の追加パッケージの公開ページにdescriptionがなかったりと寂しいので追加してみましょう。1行追加すればそれを勝手にやってくれます。newした時に作られてますが、空のファイルのためdescriptnも空になっています。README.rstを編集しましょう。package.ライセンスファイルを用意するプロジェクト内にLICENSEファイルがあればPoetryが自動的に検出してビルド成果物に含めてくれます。pyproject.tomlに以下を書くのが慣習ぽいのですが、無くても勝手に含めてくれてました。