こんにちは
今回はPoetryのインストールから使い方までの導入手順をまとめて紹介しようと思います。
これまでPythonの仮想環境といえば「venv」や「anaconda」を紹介してきました。
今回は開発現場などでも使われる「Poetry」について紹介します。
(Poetryってなんか手順が複雑そうで使いこなすのが難しそう・・)
そう思ってる方もいらっしゃるかと思いますが、実は全くそんなことはありません。
今回の記事では順を追って導入できるようにまとめてみました。
まずは気楽に導入して使ってみたいという方のお役に立てれば幸いです。
それではよろしくお願いします。
Poetryのインストール
まずは公式からインストール手順を確認します。
「With the official installer」をクリックしましょう。

下にスクロールすると、インストールコマンドが出てきます。

今回はWSLでのパターンで紹介します。
WSLを起動して、コマンドを叩くとインストールが完了します。
インストールが成功すると、次は環境変数を設定します。
環境変数の設定
環境変数というと若干拒否反応出る方がいるかもしれませんが、すぐ終わります。
インストールが完了したメッセージ内に「export PATH=”/home/〇〇〇(ユーザー名)/.local/bin:$PATH」があるかと思います。
これをコピーして、コマンドに入力します。
すると「>」が出てきて入力を求められるので、「~/.bashrc」を入力してエンターを押します。
完了したら「Ctrl+C」で入力から出ることができます。
これで環境変数の設定は完了です。
一旦ターミナルを閉じて、再起動しましょう。
再起動したら「poetry -v」と入力すると、以下のように表示されればOKです。

Poetryのversionが表示され、Poetryの主要なコマンド一覧が見られることがわかります。
なのでPoetryのコマンドを忘れた時も、「poetry -v」で確認できることを覚えておきましょう。
これでインストールは完了です。
Poetry仮想環境を構築する
続いてPoetryの仮想環境を構築してみましょう。
やり方は大きく2つあります。
poetry new 〇〇〇(任意のプロジェクト名)
poetry init
公式では「poetry new」により、決まったプロジェクトでフォルダを作る方法が紹介されています。
一方で「poetry init」では、「pyproject.toml」を対話形式で入力して作成することができます。
どちらのやり方でも、「pyproject.toml」が生成されますのでどちらのやり方でも問題ありません。
今回はpyproject.tomlを細かく設定できてシンプルな、「poetry init」の方で進めたいと思います。
ではコマンドで「poetry init」と入力します。
すると以下のような対話形式でコマンドが進みます。

基本的に何も入力せずにエンターを教えていけば、緑のデフォルト設定が適用されます。
ちなみに「poetry new」で実行した場合は、このデフォルト設定が採用されたpyproject.tomlが作成されます。
では作成したpyproject.tomlの中身を眺めてみましょう。

[tool.poetry]の内容が、作成した仮想環境のメタ情報となります。
[tool.poetry.dependencies]が依存情報(ライブラリ)になります。
この後説明しますが、必要なPythonライブラリを追記していきます。
[build-system]はビルドに関する情報ですが、ここは特に気にしなくて問題ないかと思います。
では仮想環境にライブラリを追加していきましょう。
Pythonライブラリを追加する
ライブラリを追加する時は「poetry add 〇〇〇(ライブラリ名)」とします。
例えばnumpyを追加したい場合は、
poetry add numpy
となります。
入力すると以下のようになるかと思います。

ここで「Writing lock file」と表示されますが、新しく「poetry.lock」というファイルが作成され、pyproject.tomlが修正されます。

それぞれの中身を見ると、numpy情報が追記されていることがわかります。


このpyproject.tomlとpoetry.lockはPoetry仮想環境において重要なファイルであることを覚えておいてください。
これまで仮想環境でのライブラリの追加は「pip」によるライブラリのインストールとバージョン管理でしたが、poetryでは「poetry add」になることを覚えておいてください。
仮想環境の構築については以上です。
仮想環境の起動
では必要なライブラリをインストールしたら、仮想環境を起動しましょう。
また今回動かすコードとして、私の愛読書シリーズとして「ゼロから作るDeepLearning5」のコードを使用します。
実行方法は2つあります。
poetry shell
一つ目は仮想環境を起動してスクリプトを実行する方法です。
poetry shell
するといつもの仮想環境みたく、先頭に(dzero5(任意のプロジェクト名)-py3.10)と表示されていることがわかります。

これで仮想環境上で動かせるので、いつものように実行してみましょう。

上手く動きました。
では仮想環境を「exit」と入力して一旦停止します。
この状態で先ほどのプログラムは動くでしょうか?

仮想環境が起動していないため、numpyを認識できず、当然上手く動きませんね。
poetry run
仮想環境を起動せず、特定のスクリプトのみを実行したい場合は以下のようにします。
poetry run python3 〇〇.py
この方法でも同じ結果を得ることができます。
こちらの方が手数が少なく実行できるので、一般的によく使われている方法になるかと思います。
以上がPoetryの一通りの基本的な使い方になります。
難しそうに見えて結構簡単に仮想環境の構築・起動ができることがわかるかと思います。
【補足】UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown plt.show()
matplotlibを使ってグラフを描画しようとすると、このようなメッセージが表示されてグラフが描画できないかもしれません。
これはWSL2のPython3.10内に、標準ライブラリtkinterをインストールしていないことが原因のようです。
標準ライブラリなのでpoetry addで追加することができないため、WSL2のUbuntu内にtkinterをインストールする必要があります。
以下のコマンドでWSL2にtkinterをインストールします。
sudo apt-get install python3-tk
これでグラフを描画できるようになります。
警告メッセージで検索すると「pyqt5やpyqt6をインストールすればいい」とか「matplotlib.use(“Agg”)をコードに追加すればいい」とか出ましたが、どれもダメでしたね。。
tkinterが原因だったと気づけたのは以下のstackoverflowのおかげでした。
WSLのPythonを変えたい場合はpyenvを組み合わせる方法もあります。
PoetryはPythonバージョンを変更することはできません。
なのでPythonのバージョンをpyenv、PythonライブラリをPoetryで管理するという手法も有効です。
Pythonのバージョン管理をpyenvではなくDockerで行う手法もありですし、開発現場ではこちらの方が良く見かけるように思います。
ただまぁpyenvにしろDockerにしろ煩雑になりますし、Docker使うならもうDockerだけで良くね?ってなるので、グラフ描画を解決したいならtkinterのインストールをおすすめします。
これらもご参考にどうぞ。
まとめ
今回はPoetryの導入手順についてご紹介しました。
仮想環境って色々ありますが、どれが便利で使いやすいかって悩みますよね。
私もDockerを使わない場合はvenvかminicondaを使っていましたが、現在はPoetryをよく使っています。
インストールやコマンドが複雑でないうえに、pyproject.tomlとpoetry.lockを他の人と共有できるというのがとても魅力的なツールです。
もしPython仮想環境をもっと便利にしたいと思う方は、Poetryを導入してみてはいかがでしょうか?
ここまでご覧いただきありがとうございました。