Poetry add numpyでFor numpy, a possible solution would be to set the `python` property to ">=3.7,<3.11"とでてしまう


はじめに

会社でDockerの課題を作成して、環境構築の勉強をしていただいていました。
私も一応回答として課題で求めていた環境を事前に作成していました。

しかし、数日後に質問を受けて同じ環境を同じ手順で作成したところ、エラーがでるようになっていました。
まだ記事が(世界中でも?)存在しないため、解決方法を載せます。

環境

私が使っている環境は以下となります。

FROM python:3.7-alpine

USER root
WORKDIR /app

RUN apk update
RUN apk --no-cache add\
        alpine-sdk\
        libffi-dev\
        zeromq-dev\
        openssl-dev

RUN pip install --upgrade pip

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1

RUN pip install\
        cryptography==3.4.1\
        poetry==1.1.78
docker-compose.yml
version: '3'
services:
  python3:
    restart: always
    build: .
    container_name: 'jupyter'
    working_dir: '/app'
    tty: true
    volumes:
      - ./app/:/app/
    ports:
      - "8888:8888"
pyproject.toml
[tool.poetry]
name = "app"
version = "0.1.0"
description = ""
authors = ["Your Name <[email protected]>"]

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

[tool.poetry.dev-dependencies]

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

問題

Poetry add numpyをすると以下のエラーが発生します。

$ poetry add numpy
 Because no versions of numpy match >1.21.2,<2.0.0
   and numpy (1.21.2) requires Python >=3.7,<3.11, numpy is forbidden.      
  So, because app depends on numpy (^1.21.2), version solving failed.       

  at /usr/local/lib/python3.7/site-packages/poetry/puzzle/solver.py:241 in _solve
      237│             packages = result.packages
      238│         except OverrideNeeded as e:
      239│             return self.solve_in_compatibility_mode(e.overrides, use_latest=use_latest)
      240│         except SolveFailure as e:
    → 241│             raise SolverProblemError(e)
      242│
      243│         results = dict(
      244│             depth_first_search(
      245│                 PackageNode(self._package, packages), aggregate_package_nodes

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

    For numpy, a possible solution would be to set the `python` property to ">=3.7,<3.11"

数日前までは同じ方法でインストールできていたのでいきなりできなくなりました。

解決方法

これはpoetry add numpyで最新のnumpyのバージョン1.21.2をインストールしていることが原因でした。
pyproject.tomlにあるpython = "^3.7"では対応していないようです。

以前インストールできたのは、1.21.1でした。なんとこの記事を書いた前日に新たなバージョンがリリースしておりました・

解決方法は以下の二つです。

1. Numpy1.21.2(最新版を入れる)

pyproject.tomlを以下のように変更します。

python = "^3.7"
↓
python = ">=3.7,<3.11"

すると最新版のnumpyがインストールできるようになります。

2. python="^3.7"でインストールする方法

python="^3.7"もしくはpython="3.7"の固定バージョンでインストールする場合はnumpyのバージョンを指定します。

$ poetry add numpy=1.21.1

おわりに

Dockerは常にどの環境でも動くのでとても良いですが、環境のバージョンはしっかり固定しないとこのような問題が発生してしまいます。いつどのライブラリがバージョンアップしているかわからないので、気を付けていきたいです。