tox実行時にpyenvでインストールしたバージョンを使いたい
はじめに
tox実行時に少し古めのPythonバージョンでもテストを実行したく、環境的にpyenvを使っているのでtox+pyenvな仕組みはないかを調べました。Webを検索してみるといくつかの記事があるのですが、2023年11月現在でうまく動かなかったので、別の方法を試してみました。そのメモです。
前提
toxのバージョンは4.x系です。
$ tox --version
4.11.3 from /usr/local/lib/python3.10/site-packages/tox/__init__.py
toxの4系は色々ぶれいきんぐなちぇんじーずが入ったようで、プラグインの仕組みなどが変わっているようでした。
tox-pyenv-redux を使う
結論としては、 tox-pyenv-redux を使います。
[tox]
min_version = 4.0
requires = tox-pyenv-redux
導入前後でPython3.7系の実行もうまくできるようになりました。
before:
$ tox
py37: skipped because could not find python interpreter with spec(s): py37
py37: SKIP ⚠ in 1.33 seconds
:
py37: SKIP (1.33 seconds)
py38: OK (17.28=setup[3.95]+cmd[12.62,0.40,0.31] seconds)
py39: OK (16.07=setup[3.32]+cmd[12.08,0.37,0.30] seconds)
py310: OK (15.79=setup[3.24]+cmd[11.88,0.38,0.29] seconds)
py311: OK (15.56=setup[3.43]+cmd[11.51,0.34,0.28] seconds)
congratulations :) (66.10 seconds)
after:
$ tox
ROOT: will run in automatically provisioned tox, host /usr/local/opt/python@3.10/bin/python3.10 is missing [requires (has)]: tox-pyenv-redux
ROOT: install_deps> python -I -m pip install tox-pyenv-redux 'tox>=4.0'
ROOT: provision> .tox/.tox/bin/python -m tox
:
py37: OK (20.54=setup[8.06]+cmd[11.58,0.61,0.29] seconds)
py38: OK (19.63=setup[6.05]+cmd[12.33,0.96,0.29] seconds)
py39: OK (19.53=setup[5.95]+cmd[12.70,0.57,0.30] seconds)
py310: OK (19.97=setup[6.27]+cmd[12.86,0.55,0.29] seconds)
py311: OK (18.07=setup[5.46]+cmd[11.80,0.52,0.28] seconds)
congratulations :) (97.79 seconds)
tox-pyenv-redux は裏で何をおこなっているのか?
注: 深く処理を追えていないので、わかっていることだけを頼りに書いています。
まずvirtualenvのPython環境を見つける仕組み(ここではPythonディスカバリーと呼びます)があります。
特定の PATH
から導き出す方法が一般的に使用され、そのほかにはpyenvを使った方法等をvirtualenv側の拡張で指定できるようです。そう、pyenvも使えるのです。
以前から tox+pyenvの環境で動作はできていたようなのですが、tox 4系で仕組みが変わり色々使えなくなったのではないかと思ってます。tox-pyenv-redux はtox 4系で使える tox+pyenvな環境を提供するパッケージなのです。
tox-pyenv-redux は virtualenv-pyenvというパッケージに依存しています。virtualenv-pyenvは何をしているかというと、前述のvirtualenvのPythonディスカバリーの仕組みを使って、pyenvで管理されているPythonバージョンをいい感じに探してきてvirtualenvでの環境構築ができるパッケージなのです。
tox-pyenv-redux はvirtualenv-pyenvが提供するpyenvによるPythonディスカバリーの仕組みをtox 4系のプラグインとして機能提供している形です。
注意点
2023年11月現在、tox-pyenv-redux(virtualenv-pyenv)はCPythonのみに対応しているため、pyenvでPyPy等のバージョンをインストール済みでもPythonディスカバリーの対象にはなりません。
なので、tox.ini
のenvlist
にpypy
等と記載してもスキップされてしまいます。
$ tox -e pypy --verbose
ROOT: will run in automatically provisioned tox, host /usr/local/opt/python@3.10/bin/python3.10 is missing [requires (has)]: tox-pyenv-redux
ROOT: find interpreter for spec PythonSpec(path=/usr/local/opt/python@3.10/bin/python3.10)
ROOT: proposed PythonInfo(spec=CPython3.10.13.final.0-64, exe=/usr/local/opt/python@3.10/bin/python3.10, platform=darwin, version='3.10.13 (main, Aug 24 2023, 12:59:26) [Clang 15.0.0 (clang-1500.0.40.1)]', encoding_fs_io=utf-8-utf-8)
ROOT: will run in a automatically provisioned python environment under /Users/hattori/work/autopep8.clean/.tox/.tox/bin/python
ROOT: provision> .tox/.tox/bin/python -m tox -e pypy --verbose
pypy: only CPython is currently supported
pypy: skipped because could not find python interpreter with spec(s): pypy
pypy: SKIP (0.01 seconds)
evaluation failed :( (0.06 seconds)
only CPython is currently supported
ですね。
2023.11.25追記
調べてみると、virtualenv-pyenvはpyenv-inspectというパッケージに依存していました。
pyenv-inspectはpyenvでインストール済みのPythonバージョンを探してきて、バージョンや実装(CPython, PyPy等)をパースしてくれます。このpyenv-inspectがCPythonしかパースしていないので、virtualenv-pyenvもCPythonしか対応していない、というわけでした。
Discussion