Poetryはnodeのnpmの様に、Pythonのパッケージをマネージメントする環境です。
Poetry
Poetryについて詳しく知りたい、インストールしたい方はこちらから
Poetry documentation (ver. 1.1.6 日本語訳)
Poetryが生成する各ファイルはnpmの各ファイルと対応しているようです。
npm | poetry |
---|---|
package.json | pyproject.toml |
package.lock | poetry.lock |
node_module | .venv |
Poetryを使うとパッケージを管理してくれるのはいいのですが、コマンドの実行時に下記のような形を期待されます。
poetry run python file.py
poetry runをすることによって、poetryが作った仮想環境下でpython file.pyが出来るということなんですが、このpoetryが管理しているPythonインタプリターはどこだという話になります。
私が使っているIDE = Pycharmでは、Pythonインタプリターを指定する必要があります。
poetryの管理しているインタプリターの場所
poetry config --list
でpoetryの設定情報を見ることができます。
この中の、virtualenvs.path がpoetryが仮想環境をまとめて管理している場所になります。
私の環境のデフォルトでは ${HOME}/.cache/pypoetry/virtualenvs/ となっていました。
この中の該当のプロジェクトディレクトリの名前のついたディレクトリの中にbinディレクトリがあり、その中にあるpythonがpoetryの管理する仮想環境のpythonインタプリターとなります。
また、デフォルトではvirtualenvs.in-project = falseとなっていますが、これをtrueに変更して、poetry new から poetry installすると、プロジェクトディレクトリ内に.venvディレクトリが作成されpyproject.toml内に書かれたパッケージ及び仮想環境が.venv内にインストールされます。
virtualenvs.in-project = falseの状態でプロジェクトディレクトリをすでにpoetryで管理してしまっている場合、${HOME}/.cache/pypoetry/virtualenvs/ 内の該当の仮想環境を消したあと、プロジェクトディレクトリでpoetry installを実行すれば、プロジェクトディレクトリ内に.venvが作成されます。
いずれにしろ、仮想環境ディレクトリはプロジェクトディレクトリ内にある方が管理しやすいと私は感じます。
以下の通りの手順で.venvを内包したpoetryに管理されたプロジェクトを作成することができます。
poetry config virtualenvs.in-project true
poetry new project
cd project
poetry install
プロジェクトディレクトリ内の.venv/bin/python がpoetry run が呼び出すpythonインタプリタです。
Pycharm内でpytestを使う方法
私はPythonの開発にはIDE (Pycharm)を用いています。
プロジェクトディレクトリ内の.venv/binのPythonインタプリタをPycharmでの実行用のインタプリタに指定した場合、Pycharmのpytest機能が使えなくなりました。
ターミナルでpoetry run pytest test_.pyをすれば問題なくテストが実行されるのですが、Pycharm内でテストの実行をしようとすると、pytestではなく、通常のPythonインタプリタを使ってtest_.pyが実行されているような挙動になります。
poetry run pytest では プロジェクトディレクトリ内の.venv/bin/pytestを呼び出しているのだと思いますが、pycharmでのpytestの実行時に、これを呼び出すことが出来ていないのが原因なのでしょう。
通常、Pycharmでは使用しているPythonインタプリタに紐付けられているpytestが自動的に割り振られる挙動を示すはずですが、poetryの仮想環境下におけるPythonインタプリタではそれがうまくいかないようです。
なので、pytestのランナーを手動で割り振ることにします。
Pycharmで展開しているプロジェクトディレクトリの構成は現在以下の通りとして。
Pycharmのメニューから Run -> Edit Configurationsを選択します。
画像左上の+ボタンを押して、Python tests -> pytestを選択します。
これによってリストに追加されたPython tests -> pytest in test_main.pyを選択することで、test_main.pyのpytestに用いるPythonインタプリターを設定することができます。
ここで、Python interpreterの項目に上記poetryの仮想環境における.venv/bin/pythonを設定します。
これで以後、設定該当(test_main.py)のファイルを実行した場合、自動的にpytestが走るようになります。
この件に関して、こちらの投稿を参考にしてこの方法にたどり着きました。
Thank you very much.