Poetryでpython仮想環境を構築する

Poetryとは

poetryとはpipと同じくpythonのパッケージマネージャで、JavaScriptで言う所のnpmをイメージすれば良いだろう。
pipはrequirements.txtファイルを使用してパッケージ間の依存関係を管理するが、パッケージが多くなってくると依存関係が深くなってくるため自動で依存解決するのが難しくなってくる。
そこで出てくるのがpoetryで、こちらは依存関係をより正確に制御するためバージョンの衝突を自動的に解決することができる。
またpoetryは仮想環境の作成と管理もできるのでその点も一応はメリットだ。

<独り言>
正直実際の開発現場でもpipで十分なので、好みはあれど相当巨大なプロジェクトで無い限り導入の必要性は無いようには感じる。

Poetryをインストールする

公式で提示されている方法に従ってインストールコマンドを叩いていこう。
今回はインストール先(POETRY_HOME)を指定して実行した。デフォルトだと、”~/.local/”にインストールされるようだ。

ibismark@ibismark-win:~$ pyenv version
3.12.1 (set by /home/ibismark/library/pyenv/version)
ibismark@ibismark-win:~$ 
ibismark@ibismark-win:~$ echo ${L_LIBRARY}
/home/ibismark/library
ibismark@ibismark-win:~$ 
ibismark@ibismark-win:~$ curl -sSL https://install.python-poetry.org | POETRY_HOME=${L_LIBRARY}/poetry python -
Retrieving Poetry metadata

# Welcome to Poetry!

This will download and install the latest version of Poetry,
a dependency and package manager for Python.

It will add the `poetry` command to Poetry's bin directory, located at:

/home/ibismark/library/poetry/bin

You can uninstall at any time by executing this script with the --uninstall option,
and these changes will be reverted.

Installing Poetry (1.7.1): Done

Poetry (1.7.1) is installed now. Great!

To get started you need Poetry's bin directory (/home/ibismark/library/poetry/bin) in your `PATH`
environment variable.

Add `export PATH="/home/ibismark/library/poetry/bin:$PATH"` to your shell configuration file.

Alternatively, you can call Poetry explicitly with `/home/ibismark/library/poetry/bin/poetry`.

You can test that everything is set up by executing:

`poetry --version`

ibismark@ibismark-win:~$ 
ibismark@ibismark-win:~$ 

インストールが終わると、(僕の場合は)/home/ibismark/library/poetry/binにPATHを通せと指示されたので、ログイン時にPATHが通る用に.profileへ環境変数の設定を行った。
これでpoetryコマンドが使用可能になった。

ibismark@ibismark-win:~$ vi ~/.profile
・・・
export POETRY_HOME="$L_LIBRARY/poetry"
export PATH="$POETRY_HOME/bin:$PATH"
・・・
ibismark@ibismark-win:~$ source ~/.profile
ibismark@ibismark-win:~$ poetry --version
Poetry (version 1.7.1)


Poetryの初期設定

ibismark@ibismark-win:~$ cd ~/workspace/otam/
ibismark@ibismark-win:~/workspace/otam$ rm -rf .venv3.12.1/

次のコマンドを実行すると、pyproject.tomlというファイルが作成される。
途中インタラクティブな入力を求められるのだが、後からpyproject.toml内の必要なプロパティを手動で変更できるので何も入力せずに全てEnterしちゃっておーけーだ。

ibismark@ibismark-win:~/workspace/otam$ poetry init -C ~/workspace/otam
・・・
(インタラクティブな入力を求められるが入力せず全部Enterで良い)
・・・
ibismark@ibismark-win:~/workspace/otam$ ls -l ~/workspace/otam/
・・・
-rw-r--r-- 1 ibismark ibismark  263 Feb 15 23:00 pyproject.toml
ibismark@ibismark-win:~/workspace/otam$ 
ibismark@ibismark-win:~/workspace/otam$ vi pyproject.toml
[tool.poetry]
name = "otam"
↓
name = "otam_server"
ibismark@ibismark-win:~/workspace/otam$ 
ibismark@ibismark-win:~/workspace/otam$ cat pyproject.toml
[tool.poetry]
name = "otam_server"
version = "0.1.0"
description = ""
authors = ["Nao <*****@gmail.com>"]
readme = "README.md"

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


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

Poetryは自動でvenv環境を作成してくれるのだが、次のコマンドはそのvenv環境をどこに配置するかを設定することができる。
trueにするとそのプロジェクトの中にvenvが作成されるし、falseにするとデフォルトでは~/.cache/pypoetry/にvenvが作成される。

ibismark@ibismark-win:~/workspace/otam$ poetry config virtualenvs.in-project true --local

# virtualenvs.in-projectがtrueになってればおーけー
ibismark@ibismark-win:~/workspace/otam$ poetry config --list --local
cache-dir = "/home/ibismark/.cache/pypoetry"
experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true
installer.no-binary = null
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}/virtualenvs"  # /home/ibismark/.cache/pypoetry/virtualenvs
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
warnings.export = true
ibismark@ibismark-win:~/workspace/otam$


ibismark@ibismark-win:~/workspace/otam$ ls -l ~/workspace/otam
・・・
-rw------- 1 ibismark ibismark   32 Feb 15 23:25 poetry.toml

<補足:--localオプションの意味>
--localオプションを指定すると、config設定の変更がカレントプロジェクトにのみ適用される。
poetryコマンドが実行される時configファイルがロードされるのだが、グローバルファイルをロードした後、ローカルファイルをロードして設定を上書きしている。
--localオプションをつけたpoetry configによる設定値の変更は、このローカルファイルの値を更新しているのだ。
このローカルファイルだが、--localオプションで実行した際、プロジェクトルート(pyproject.tomlがある所)にpoetry.tomlという形で作成される。
因みにグローバルファイルは~/.config/pypoetry/config.tomlに存在する。

Poetryを使ってDjango5.0をインストールする

次のコマンドで依存関係を含んだインストール情報を構成した上で、Djangoパッケージをインストールする。

ibismark@ibismark-win:~$ cd ~/workspace/otam/
ibismark@ibismark-win:~/workspace/otam$ poetry add Django==5.0.2
Creating virtualenv otam in /home/ibismark/workspace/otam/.venv

Updating dependencies
Resolving dependencies... (0.2s)

Package operations: 3 installs, 0 updates, 0 removals

  • Installing asgiref (3.7.2)
  • Installing sqlparse (0.4.4)
  • Installing django (5.0.2)

Writing lock file
ibismark@ibismark-win:~/workspace/otam$ ls -l
・・・
-rw-r--r-- 1 ibismark ibismark 2271 Feb 15 23:51 poetry.lock
ibismark@ibismark-win:~/workspace/otam$ 
ibismark@ibismark-win:~/workspace/otam$ cat pyproject.toml
・・・
[tool.poetry.dependencies]
python = "^3.12"
django = "5.0.2"
・・・ 

# インストールされたパッケージ一覧
# djangoはasgirefとsqlparseに依存しているので、djangoをインストールすると一緒に引っ付いてくる
ibismark@ibismark-win:~/workspace/otam$ poetry show
asgiref  3.7.2 ASGI specs, helper code, and adapters
django   5.0.2 A high-level Python web framework that encourages rapid development and clean, pragmatic design.
sqlparse 0.4.4 A non-validating SQL parser.

# 依存関係を分かりやすくグラフィカルに出力
ibismark@ibismark-win:~/workspace/otam$ poetry show -t
django 5.0.2 A high-level Python web framework that encourages rapid development and clean, pragmatic design.
├── asgiref >=3.7.0,<4
├── sqlparse >=0.3.1
└── tzdata *

<補足1:poetry add>
・プロジェクトルートに.venvが存在しない場合は作成する。
・プロジェクトルートにpoetry.lockが存在しない場合は作成する。
・pyproject.tomlにインストール対象のパッケージが追記され、poetry.lockに依存情報を含んだインストール情報が記載されることになる。

<補足2:仮想環境の再構成>
これでvenv仮想環境が消えてしまったり、別の開発環境下でも次のコマンドですぐにパッケージを再インストールできる。
ibismark@ibismark-win:~/workspace/otam$ poetry install

<独り言>
pipと違って、パッケージ間の依存関係を分かりやすく表示してくれるのは嬉しい所。

Djangoの動作確認を行う

仮想環境に入る際は、従来通りsourceコマンドを使うのも良いし、poetryがpoetry shellというラッパーコマンドを用意してくれているのでそっちを使うのも良いだろう。

ibismark@ibismark-win:~/workspace/otam/otam_server$ poetry shell
or
ibismark@ibismark-win:~/workspace/otam$ source .venv/bin/activate


(otam-py3.12) ibismark@ibismark-win:~/workspace/otam$ cd otam_server/
(otam-py3.12) ibismark@ibismark-win:~/workspace/otam/otam_server$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
February 15, 2024 - 16:40:25
Django version 5.0.2, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.


この記事が気に入ったらサポートをしてみませんか?