pip ではインストールできるのに PDM や Poetry でインストールできないときに確認したいこと


# 概要

[Vosk](https://pypi.org/project/vosk/) など一部の PyPi パッケージは pip ではインストールできるのに PDM や Poetry ではインストールに失敗することがあります。

そのような時に確認すると解決に繋がるかもしれない観点を説明します。

# 前提・環境情報

* 前提
  * Vosk のバージョン情報については　**2025年1月18日** 現在のものです
* 環境情報
  * `pip` のバージョン: `23.1.2`
  * PDM のバージョン: `2.22.2`
  * Poetry のバージョン: `2.0.1`

# 対象者

* pip や、PDM もしくは Poetry が何かを理解している・利用している
* とある PyPi のパッケージについて、 pip ではインストールできるのに PDM や Poetry では以下のようなエラーが発生する

↓ PDM でのエラー（抜粋）

```text
pdm.exceptions.CandidateNotFound: No candidate is found for '<PACKAGE_NAME>' that matches the environment or hashes
```

↓ Poetry でのエラー（抜粋）

```text
Unable to find installation candidates for <PACKAGE_NAME> (<PACKAGE_VERSION>)
```

# 結論・要約

当該パッケージの最新版に、ご自身の環境（ホストマシンのOSやOSのアーキテクチャなど）にマッチする Distribution が存在していないことが原因かもしれません。

当該パッケージの PyPi のサイトにアクセスし、 "Download files" ナビゲーション をクリックして、
Distribution の一覧を確認してみましょう。

インストールする際にバージョンを指定しないとき、  pip と PDM (もしくは Poetry) ではバージョン選択の挙動が異なります。

* pip では、インストールする環境にマッチする最新の Distribution を選択する
* PDM や Poetry では、最新版のみを見て環境にマッチする Distribution が存在しないと例外を発生させる

# 詳細説明

私は Vosk をバージョン指定せずに、 macOS にインストールしたとき今回のエラーに遭遇しました。その時のトラブルシューティングに基づいて詳細を説明します。

## pip でのインストール

まずは pip で Vosk をインストールします。この時、バージョン を見ると `0.3.34` になっていますね。（当時の最新版は `0.3.45` です）

![pip_installation_successes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/65275801-38af-1437-02ce-c31389a51273.png)

実際、 `pip` のドキュメントを読むと以下のような記述があり、検索したすべてのソース（PyPiやローカルファイルシステムなど）を確認し、与えられた要件（Python バージョン、依存関係、OS アーキテクチャなど）に基づいて、最適なバージョンを選ぶことが分かります。

> pip looks for packages in a number of places: on PyPI (or the index given as --index-url, if not disabled via --no-index),
> in the local filesystem, and in any additional repositories specified via --find-links or --extra-index-url.
> There is no priority in the locations that are searched.
> Rather they are all checked, and the “best” match for the requirements (in terms of version number - see the specification for details) is selected.

引用: [pip install -- Finding Package](https://pip.pypa.io/en/stable/cli/pip_install/#finding-packages)

一方、 PDM や Poetry でインストールすると以下のようにエラーが発生します。そして、 pip と異なり、最新版である `0.3.45` しか見ていないことが分かります。

## PDM のインストールエラー

`$ pdm add vosk` を実行します。 `0.3.45` をインストールしようとして「環境やハッシュにマッチするVoskの候補が見つからない」というエラーが出ていますね。

![pdm_installation_fails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/2ff57d93-4f84-2aa5-5263-0fd69d488f6d.png)

## Poetry のインストールエラー

`$ poetry add vosk` を実行します。PDM と同様に  `0.3.45` をインストールしようとして「 vosk (0.3.45) のインストール候補が見つかりません」というエラーが出ていますね。

![poetry_installation_fails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/f2c85426-e2bc-2eba-5e32-954be104e65f.png)

## PyPi で Distribution を確認

ここで、 PyPi のサイトで Distribution を確認してみましょう。

[PyPi - vosk 0.3.45](https://pypi.org/project/vosk/0.3.45/) を確認すると以下のように、 macOS に該当する Distribution が見当たりません。

![vosk_0345_dist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/f9f34bf7-cc02-b0ca-04bb-0d494ad33de8.png)

一方、次点で最新である [PyPi - vosk 0.3.44](https://pypi.org/project/vosk/0.3.44/) を見てみましょう。

以下のように "Release history" ナビゲーションから閲覧するバージョンを切り替えることができます。

![vosk_download_history.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/4a45713c-b9c9-2434-821c-a784a40d2b63.png)

[PyPi - vosk 0.3.44](https://pypi.org/project/vosk/0.3.44/) を確認すると、 macOS に対応するファイル名とタグが見受けられます。
よって、 `0.3.44` であればインストールに成功すると考えられます。

![vosk_0344_dist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201801/6c2c5ea3-2d0b-e1a6-7d07-3f4e0a2de98a.png)

## 解決方法: バージョンを指定して Vosk をインストールする

PDM や Poetry で macOS に Vosk をインストールするとき「環境にマッチしない」という趣旨のエラーが発生するかもしれません。
そのような時は PyPi でご自身の環境にマッチする バージョン を探し、その バージョン を指定するようにインストールすると良いかもしれません。

実際に、以下のコマンドではインストールに成功しました。

```sh
pdm add vosk==0.3.44
poetry add vosk==0.3.44
```