環境
- Python 3.12.4
- Poetry 1.8.3
はじめに
Poetryを使って、Pythonのアプリケーションを開発しています。
仮想環境はプロジェクト内に作成するように設定しています。
$ pwd
/home/yuji/tmp/awesome
$ tree
.
├── README.md
├── awesome
│ └── __init__.py
├── poetry.lock
├── poetry.toml
├── pyproject.toml
└── tests
└── __init__.py
2 directories, 6 files
$ ls .venv/
bin lib pyvenv.cfg
[tool.poetry]
package-mode = false
[tool.poetry.dependencies]
python = "^3.12"
mypy = "^1"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
[virtualenvs]
in-project = true
$ poetry run python --version
Python 3.12.4
$ poetry run mypy --version
mypy 1.10.1 (compiled: yes)
何が起きたのか
/home/yuji/tmp/awesome
ディレクトリの名前を、awesome2
に変更しました。
$ cd /home/yuji/tmp/
$ mv awesome awesome2
ディレクトリ名変更後では、poetry run mypy --version
を実行できませんでした。
$ cd awesom2
$ poetry run mypy --version
Command not found: mypy
ただし、poetry run python -m mypy
は実行できました。
$ poetry run python -m mypy --version
mypy 1.10.1 (compiled: yes)
poetry run mypy
を実行できない原因
/home/tmp/awesome2/.venv/bin/mypy
の中身は以下の通りです。シバンには/home/yuji/tmp/awesome/.venv/bin/python
と絶対パスが記載されています。なので、awesome
ディレクトリの名前を変えたら、動かくなくなったようです。
#!/home/yuji/tmp/awesome/.venv/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from mypy.__main__ import console_entry
if __name__ == "__main__":
sys.argv[0] = re.sub(r"(-script\.pyw|\.exe)?$", "", sys.argv[0])
sys.exit(console_entry())
「仮想環境がプロジェクト内にあるので、プロジェクト名を変えても問題ない(相対パスで記載されているだろう)と」思っていたため、エラーの原因を特定するのに少し時間がかかってしまいました。
ちなみに、.venv/bin/python
はシンボリックリンクなので、ディレクトリ名を変更してもpoetry run python
で実行できます。
$ ls .venv/bin/python -l
lrwxrwxrwx 1 yuji yuji 48 Jul 19 09:46 .venv/bin/python -> /home/yuji/.pyenv/versions/3.12.4/bin/python3.12
解決方法
Poetry
で管理しているプロジェクトのパスが変わったら、仮想環境を作り直しましょう。
補足
.venv/bin/mypy
のシバンは、pip
の以下のコードで生成しているようです。