poetryでパッケージ追加時のpython依存関係解決メモ

# 背景

最近になってpythonの勉強を始めました。

poetryへpyside6やmanimを追加しようとした時にうまくいかなかったので、
解決方法のメモを残しておきます。

## 解法

pysideのバージョンは、pythonのバージョンによって[バージョンが変わる](https://wiki.qt.io/Qt_for_Python#Python_compatibility_matrix)ので、
pythonバージョンの上限を設定すると良いそうです。

```diff_toml: pyproject.toml
[tool.poetry.dependencies]
- python = "^3.12" 
+ python = ">=3.12,<3.13"
```

他の方法もあります。
- [別解1: pyproject.tomlのパッケージの項目で指定](#32-方法2)
- [別解2: poetry add時に指定](#33-方法3)


## 詳細

簡単なpoetryの使い方を交えて、今回のエラーについて記載しておきます。

もし結論の詳細から見たい場合は、[こちら](#31-方法1)から飛べます。

### 1. poetry概要

[poetry](https://python-poetry.org)は、パッケージ管理の1つです。
`pyproject.toml` という設定ファイル内に、パッケージ名や外部パッケージのバージョン等を記載していきます。

まず、使用を始めるためにnewやinitコマンドを使います。

```shell
### ディレクトリごと新規作成する場合はnewを使う
poetry new sample
```

次に作成されたディレクトリ内に移動し、パッケージを追加していきます。
パッケージを追加する場合は、`pip`の代わりにaddコマンドを使います。

必要によってはバージョンの指定もできます。

```shell
### パッケージを追加
poetry add numpy
```

この際、 `pyproject.toml` ファイルの中には、メタデータや追加したパッケージについて
自動で記入されていきます。

<details>
<summary>pyproject.toml</summary>

```toml: pyproject.toml
[tool.poetry]
name = "sample"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"

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


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

</details>

### 2. 問題発生 (pyside6の追加)

ここで、同様の手順でpyside6をインストールするとうまくいきませんでした。

```console
$ poetry add pyside6
Using version ^6.6.3 for pyside6

Updating dependencies
Resolving dependencies... (0.0s)

The current project's supported Python range (>=3.12,<4.0) is not compatible with some of the required packages Python requirement:
  - pyside6 requires Python <3.13,>=3.8, so it will not be satisfied for Python >=3.13,<4.0

Because no versions of pyside6 match >6.6.3,<7.0.0
 and pyside6 (6.6.3) requires Python <3.13,>=3.8, pyside6 is forbidden.
So, because sample depends on pyside6 (^6.6.3), version solving failed.

  • Check your dependencies Python requirement: The Python requirement can be specified via the `python` or `markers` properties

    For pyside6, a possible solution would be to set the `python` property to ">=3.12,<3.13"

    https://python-poetry.org/docs/dependency-specification/#python-restricted-dependencies,
    https://python-poetry.org/docs/dependency-specification/#using-environment-markers
```

### 3. 解決 (pythonのバージョン指定)

重要なのは、以下の行です。

>  For pyside6, a possible solution would be to set the `python` property to ">=3.12,<3.13"

現在pythonのバージョンは `^3.12` (>=3.12,<4.0と[同等の表記](https://python-poetry.org/docs/dependency-specification/#caret-requirements))なので、
ここを変更すると良いようです。

#### 3.1 方法1

指示通り、 `pyproject.toml` のpythonのバージョンを変更してみます。

```diff_toml: pyproject.toml
[tool.poetry.dependencies]
- python = "^3.12" 
+ python = ">=3.12,<3.13"
```

再度パッケージの追加を行うと、無事うまくいきました。

```sh
$ poetry add pyside6
Using version ^6.6.3 for pyside6

Updating dependencies
Resolving dependencies... (0.1s)

Package operations: 4 installs, 0 updates, 0 removals
...
```

これで環境構築が終わり、pysideに触れられそうです！

#### 3.2 方法2

[パッケージに対するpythonのバージョン指定](https://python-poetry.org/docs/dependency-specification/#python-restricted-dependencies)を使った方法でもできました。

```toml: pyproject.toml
[tool.poetry.dependencies]
pyside6 = { version = "^6.6.2", python = "<3.13" }
```

編集後、インストールコマンドを実行すると追加されます。

```sh
poetry install
```

#### 3.3 方法3

パッケージ追加時に `--python=` オプションを使ってもできました。

```shell
poetry add pyside6 --python=">=3.12,<3.13"
```

結果的に `pyproject.toml` 内に[解法2](#32-方法2)と同様の内容が追記されます。

## 関連リンク

https://qiita.com/insilicomab/items/278abf53a82a12fe4f01