Skip to content

tox-uv fails on variable interpolation when interpreter is unavailable #189

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
stinovlas opened this issue Mar 18, 2025 · 0 comments
Open
Labels
bug Something isn't working

Comments

@stinovlas
Copy link

Issue

Consider following tox.ini.

[tox]
minversion = 4.18.0
envlist =
    py39
    py310
    py311
    py312
    py313
skip_missing_interpreters = true

[testenv]
setenv =
    MYVAR = {env:MYVAR:{envsitepackagesdir}/something}
uv_python_preference = only-system
command = echo $MYVAR

When I run tox without tox-uv installed, it passes and correctly skips all unavailable python interpreters. However, when tox-uv is installed, exception is raised and job ends in FAIL state instead of SKIP.

This is probably caused by env interpolation, because when I omit {envsitepackagesdir} from the variable default, everything works as expected.

Environment

Provide at least:

  • OS: Linux, Debian trixie
Output of pip list of the host Python, where tox is installed
Package       Version
------------- -------
cachetools    5.5.2
chardet       5.2.0
colorama      0.4.6
distlib       0.3.9
filelock      3.18.0
packaging     24.2
pip           24.3.1
platformdirs  4.3.6
pluggy        1.5.0
pyproject-api 1.9.0
tox           4.24.2
tox-uv        1.25.0
uv            0.6.7
virtualenv    20.29.3

Output of running tox

Output of tox -rvv
py39: 1602 W remove tox env folder /home/jmusilek/test/tox-uv-fail/.tox/py39 [tox/tox_env/api.py:332]
py39: 1646 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.9 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py39 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.9 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/usr/bin/python3` (search path)
DEBUG Skipping interpreter at `/usr/bin/python3` from search path: does not satisfy request `3.9`
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/bin/python3` (search path)
DEBUG Skipping interpreter at `/bin/python3` from search path: does not satisfy request `3.9`
  × No interpreter found for CPython 3.9 in search path
py39: 1727 E internal error [tox/session/cmd/run/single.py:60]
Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 77, in replacer
    replaced = replace(conf, reference_replacer, raw_, args_)  # do replacements
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 70, in replace
    return Replacer(conf, reference, conf_args=args, depth=depth).join(find_replace_expr(value))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 204, in _replace_match
    flattened_args = [self.join(arg) for arg in value.expr]
                      ^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 218, in _replace_match
    replace_value = self.reference(arg_value, conf_args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 58, in __call__
    raise exception
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 42, in __call__
    value = src.load(key, conf_args.chain)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 60, in __call__
    return self.value() if callable(self.value) else self.value
           ^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 250, in env_site_package_dir
    py = self._py_info
         ^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 995, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 283, in _py_info
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 222, in create_python_env
    raise Skip(msg)
tox.tox_env.errors.Skip: could not find python interpreter with spec(s): cpython3.9

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/session/cmd/run/single.py", line 47, in _evaluate
    tox_env.setup()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/api.py", line 257, in setup
    self._setup_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/runner.py", line 98, in _setup_env
    super()._setup_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/api.py", line 231, in _setup_env
    self.ensure_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/api.py", line 238, in ensure_python_env
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 213, in create_python_env
    if self.conf["system_site_packages"]:
       ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 122, in __getitem__
    return self.load(item)
           ^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 117, in __call__
    value = self.default(conf, args.env_name) if callable(self.default) else self.default
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 69, in <lambda>
    self.environment_variables.get("VIRTUALENV_SYSTEM_SITE_PACKAGES", "False"),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 184, in environment_variables
    env = super().environment_variables
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/runner.py", line 193, in environment_variables
    environment_variables = super().environment_variables
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/api.py", line 351, in environment_variables
    result[key] = set_env.load(key)
                  ^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/set_env.py", line 90, in load
    result = self._replacer(raw, args)  # apply any replace options
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 83, in replacer
    raise HandledError(msg) from exception
tox.report.HandledError: replace failed in py39.setenv with Skip('could not find python interpreter with spec(s): cpython3.9')
py39: FAIL ✖ in 0.15 seconds
py310: 1751 W remove tox env folder /home/jmusilek/test/tox-uv-fail/.tox/py310 [tox/tox_env/api.py:332]
py310: 1776 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.10 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/usr/bin/python3.10` (search path)
Using CPython 3.10.9 interpreter at: /usr/bin/python3.10
Creating virtual environment at: .tox/py310
DEBUG Using base executable for virtual environment: /usr/bin/python3.10
DEBUG Allowing existing directory
py310: 1847 I exit 0 (0.07 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 pid=3517475 [tox/execute/api.py:294]
py310: 1856 W venv-query> .tox/py310/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py [tox/tox_env/api.py:434]
py310: 2083 I exit 0 (0.22 seconds) /home/jmusilek/test/tox-uv-fail> .tox/py310/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py pid=3517483 [tox/execute/api.py:294]
py310: 2088 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.10 in search path
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3.10` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3.10`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/usr/bin/python3.10` (search path)
Using CPython 3.10.9 interpreter at: /usr/bin/python3.10
Creating virtual environment at: .tox/py310
DEBUG Using base executable for virtual environment: /usr/bin/python3.10
DEBUG Allowing existing directory
py310: 2158 I exit 0 (0.07 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 pid=3517488 [tox/execute/api.py:294]
py311: 2165 W remove tox env folder /home/jmusilek/test/tox-uv-fail/.tox/py311 [tox/tox_env/api.py:332]
py310: OK ✔ in 0.42 seconds
py311: 2188 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.11 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/usr/bin/python3.11` (search path)
Using CPython 3.11.8 interpreter at: /usr/bin/python3.11
Creating virtual environment at: .tox/py311
DEBUG Using base executable for virtual environment: /usr/bin/python3.11
DEBUG Allowing existing directory
py311: 2249 I exit 0 (0.06 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 pid=3517500 [tox/execute/api.py:294]
py311: 2254 W venv-query> .tox/py311/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py [tox/tox_env/api.py:434]
py311: 2455 I exit 0 (0.20 seconds) /home/jmusilek/test/tox-uv-fail> .tox/py311/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py pid=3517508 [tox/execute/api.py:294]
py311: 2462 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.11 in search path
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3.11` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3.11`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/usr/bin/python3.11` (search path)
Using CPython 3.11.8 interpreter at: /usr/bin/python3.11
Creating virtual environment at: .tox/py311
DEBUG Using base executable for virtual environment: /usr/bin/python3.11
DEBUG Allowing existing directory
py311: 2526 I exit 0 (0.06 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 pid=3517513 [tox/execute/api.py:294]
py312: 2533 W remove tox env folder /home/jmusilek/test/tox-uv-fail/.tox/py312 [tox/tox_env/api.py:332]
py311: OK ✔ in 0.37 seconds
py312: 2563 W venv> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` from explicit request
DEBUG Checking for Python interpreter at path `.direnv/python-3.12.8/bin/python3`
Using CPython 3.12.8 interpreter at: .direnv/python-3.12.8/bin/python3
Creating virtual environment at: .tox/py312
DEBUG Using base executable for virtual environment: /usr/bin/python3.12
DEBUG Allowing existing directory
py312: 2636 I exit 0 (0.07 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 pid=3517525 [tox/execute/api.py:294]
py312: 2643 W venv-query> .tox/py312/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py [tox/tox_env/api.py:434]
py312: 2844 I exit 0 (0.20 seconds) /home/jmusilek/test/tox-uv-fail> .tox/py312/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py pid=3517532 [tox/execute/api.py:294]
py312: 2849 W venv> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` from explicit request
DEBUG Checking for Python interpreter at path `.direnv/python-3.12.8/bin/python3`
Using CPython 3.12.8 interpreter at: .direnv/python-3.12.8/bin/python3
Creating virtual environment at: .tox/py312
DEBUG Using base executable for virtual environment: /usr/bin/python3.12
DEBUG Allowing existing directory
py312: 2917 I exit 0 (0.06 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 pid=3517538 [tox/execute/api.py:294]
py313: 2924 W remove tox env folder /home/jmusilek/test/tox-uv-fail/.tox/py313 [tox/tox_env/api.py:332]
py312: OK ✔ in 0.39 seconds
py313: 2945 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.13 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py313 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.13 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/usr/bin/python3` (search path)
DEBUG Skipping interpreter at `/usr/bin/python3` from search path: does not satisfy request `3.13`
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/bin/python3` (search path)
DEBUG Skipping interpreter at `/bin/python3` from search path: does not satisfy request `3.13`
  × No interpreter found for CPython 3.13 in search path
py313: 3016 E internal error [tox/session/cmd/run/single.py:60]
Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 77, in replacer
    replaced = replace(conf, reference_replacer, raw_, args_)  # do replacements
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 70, in replace
    return Replacer(conf, reference, conf_args=args, depth=depth).join(find_replace_expr(value))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 204, in _replace_match
    flattened_args = [self.join(arg) for arg in value.expr]
                      ^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 218, in _replace_match
    replace_value = self.reference(arg_value, conf_args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 58, in __call__
    raise exception
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 42, in __call__
    value = src.load(key, conf_args.chain)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 60, in __call__
    return self.value() if callable(self.value) else self.value
           ^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 250, in env_site_package_dir
    py = self._py_info
         ^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 995, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 283, in _py_info
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 222, in create[I] (3.12.8) jmusilek@alfheim:~/t/tox-uv-fail [255] $ rm .tox -rf
[I] (3.12.8) jmusilek@alfheim:~/t/tox-uv-fail $ tox -rvv
py39: 211 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.9 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py39 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.9 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/usr/bin/python3` (search path)
DEBUG Skipping interpreter at `/usr/bin/python3` from search path: does not satisfy request `3.9`
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/bin/python3` (search path)
DEBUG Skipping interpreter at `/bin/python3` from search path: does not satisfy request `3.9`
  × No interpreter found for CPython 3.9 in search path
py39: 227 E internal error [tox/session/cmd/run/single.py:60]
Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 77, in replacer
    replaced = replace(conf, reference_replacer, raw_, args_)  # do replacements
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 70, in replace
    return Replacer(conf, reference, conf_args=args, depth=depth).join(find_replace_expr(value))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 204, in _replace_match
    flattened_args = [self.join(arg) for arg in value.expr]
                      ^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 218, in _replace_match
    replace_value = self.reference(arg_value, conf_args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 58, in __call__
    raise exception
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 42, in __call__
    value = src.load(key, conf_args.chain)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 60, in __call__
    return self.value() if callable(self.value) else self.value
           ^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 250, in env_site_package_dir
    py = self._py_info
         ^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 995, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 283, in _py_info
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 222, in create_python_env
    raise Skip(msg)
tox.tox_env.errors.Skip: could not find python interpreter with spec(s): cpython3.9

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/session/cmd/run/single.py", line 47, in _evaluate
    tox_env.setup()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/api.py", line 257, in setup
    self._setup_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/runner.py", line 98, in _setup_env
    super()._setup_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/api.py", line 231, in _setup_env
    self.ensure_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/api.py", line 238, in ensure_python_env
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 213, in create_python_env
    if self.conf["system_site_packages"]:
       ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 122, in __getitem__
    return self.load(item)
           ^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 117, in __call__
    value = self.default(conf, args.env_name) if callable(self.default) else self.default
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 69, in <lambda>
    self.environment_variables.get("VIRTUALENV_SYSTEM_SITE_PACKAGES", "False"),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 184, in environment_variables
    env = super().environment_variables
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/runner.py", line 193, in environment_variables
    environment_variables = super().environment_variables
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/api.py", line 351, in environment_variables
    result[key] = set_env.load(key)
                  ^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/set_env.py", line 90, in load
    result = self._replacer(raw, args)  # apply any replace options
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 83, in replacer
    raise HandledError(msg) from exception
tox.report.HandledError: replace failed in py39.setenv with Skip('could not find python interpreter with spec(s): cpython3.9')
py39: FAIL ✖ in 0.03 seconds
py310: 235 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.10 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/usr/bin/python3.10` (search path)
Using CPython 3.10.9 interpreter at: /usr/bin/python3.10
Creating virtual environment at: .tox/py310
DEBUG Using base executable for virtual environment: /usr/bin/python3.10
DEBUG Allowing existing directory
py310: 252 I exit 0 (0.02 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 pid=3517637 [tox/execute/api.py:294]
py310: 254 W venv-query> .tox/py310/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py [tox/tox_env/api.py:434]
py310: 291 I exit 0 (0.04 seconds) /home/jmusilek/test/tox-uv-fail> .tox/py310/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py pid=3517645 [tox/execute/api.py:294]
py310: 292 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.10 in search path
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3.10` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3.10`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python3`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py310/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.10.9-linux-x86_64-gnu` at `/usr/bin/python3.10` (search path)
Using CPython 3.10.9 interpreter at: /usr/bin/python3.10
Creating virtual environment at: .tox/py310
DEBUG Using base executable for virtual environment: /usr/bin/python3.10
DEBUG Allowing existing directory
py310: 304 I exit 0 (0.01 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.10 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py310 pid=3517650 [tox/execute/api.py:294]
py310: OK ✔ in 0.08 seconds
py311: 312 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.11 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/usr/bin/python3.11` (search path)
Using CPython 3.11.8 interpreter at: /usr/bin/python3.11
Creating virtual environment at: .tox/py311
DEBUG Using base executable for virtual environment: /usr/bin/python3.11
DEBUG Allowing existing directory
py311: 327 I exit 0 (0.01 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 pid=3517661 [tox/execute/api.py:294]
py311: 328 W venv-query> .tox/py311/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py [tox/tox_env/api.py:434]
py311: 358 I exit 0 (0.03 seconds) /home/jmusilek/test/tox-uv-fail> .tox/py311/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py pid=3517668 [tox/execute/api.py:294]
py311: 359 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.11 in search path
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3.11` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3.11`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python3`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.tox/py311/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.11.8-linux-x86_64-gnu` at `/usr/bin/python3.11` (search path)
Using CPython 3.11.8 interpreter at: /usr/bin/python3.11
Creating virtual environment at: .tox/py311
DEBUG Using base executable for virtual environment: /usr/bin/python3.11
DEBUG Allowing existing directory
py311: 371 I exit 0 (0.01 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p cpython3.11 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py311 pid=3517673 [tox/execute/api.py:294]
py311: OK ✔ in 0.07 seconds
py312: 375 W venv> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` from explicit request
DEBUG Checking for Python interpreter at path `.direnv/python-3.12.8/bin/python3`
Using CPython 3.12.8 interpreter at: .direnv/python-3.12.8/bin/python3
Creating virtual environment at: .tox/py312
DEBUG Using base executable for virtual environment: /usr/bin/python3.12
DEBUG Allowing existing directory
py312: 387 I exit 0 (0.01 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 pid=3517684 [tox/execute/api.py:294]
py312: 388 W venv-query> .tox/py312/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py [tox/tox_env/api.py:434]
py312: 419 I exit 0 (0.03 seconds) /home/jmusilek/test/tox-uv-fail> .tox/py312/bin/python /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv_query.py pid=3517691 [tox/execute/api.py:294]
py312: 420 W venv> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` from explicit request
DEBUG Checking for Python interpreter at path `.direnv/python-3.12.8/bin/python3`
Using CPython 3.12.8 interpreter at: .direnv/python-3.12.8/bin/python3
Creating virtual environment at: .tox/py312
DEBUG Using base executable for virtual environment: /usr/bin/python3.12
DEBUG Allowing existing directory
py312: 436 I exit 0 (0.01 seconds) /home/jmusilek/test/tox-uv-fail> .direnv/python-3.12.8/bin/uv venv -p /home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py312 pid=3517696 [tox/execute/api.py:294]
py312: OK ✔ in 0.06 seconds
py313: 442 W venv> .direnv/python-3.12.8/bin/uv venv -p cpython3.13 --allow-existing -v --python-preference only-system /home/jmusilek/test/tox-uv-fail/.tox/py313 [tox/tox_env/api.py:434]
DEBUG uv 0.6.7
DEBUG Using Python request `[email protected]` from explicit request
DEBUG Searching for CPython 3.13 in search path
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3` (first executable in the search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python3`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python` (search path)
DEBUG Ignoring Python interpreter at `/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/bin/python`: system interpreter required
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/usr/bin/python3` (search path)
DEBUG Skipping interpreter at `/usr/bin/python3` from search path: does not satisfy request `3.13`
DEBUG Found `cpython-3.12.8-linux-x86_64-gnu` at `/bin/python3` (search path)
DEBUG Skipping interpreter at `/bin/python3` from search path: does not satisfy request `3.13`
  × No interpreter found for CPython 3.13 in search path
py313: 455 E internal error [tox/session/cmd/run/single.py:60]
Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 77, in replacer
    replaced = replace(conf, reference_replacer, raw_, args_)  # do replacements
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 70, in replace
    return Replacer(conf, reference, conf_args=args, depth=depth).join(find_replace_expr(value))
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 204, in _replace_match
    flattened_args = [self.join(arg) for arg in value.expr]
                      ^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 199, in join
    return "".join(self(value))
                   ^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 196, in __call__
    return [self._replace_match(me) if isinstance(me, MatchExpression) else str(me) for me in value]
            ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/replacer.py", line 218, in _replace_match
    replace_value = self.reference(arg_value, conf_args)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 58, in __call__
    raise exception
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/replace.py", line 42, in __call__
    value = src.load(key, conf_args.chain)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 60, in __call__
    return self.value() if callable(self.value) else self.value
           ^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 250, in env_site_package_dir
    py = self._py_info
         ^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 995, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 283, in _py_info
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 222, in create_python_env
    raise Skip(msg)
tox.tox_env.errors.Skip: could not find python interpreter with spec(s): cpython3.13

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/session/cmd/run/single.py", line 47, in _evaluate
    tox_env.setup()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/api.py", line 257, in setup
    self._setup_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/runner.py", line 98, in _setup_env
    super()._setup_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/api.py", line 231, in _setup_env
    self.ensure_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/python/api.py", line 238, in ensure_python_env
    self.create_python_env()
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 213, in create_python_env
    if self.conf["system_site_packages"]:
       ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 122, in __getitem__
    return self.load(item)
           ^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/sets.py", line 133, in load
    return config_definition.__call__(self._conf, self.loaders, ConfigLoadArgs(chain, self.name, self.env_name))  # noqa: PLC2801
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/of_type.py", line 117, in __call__
    value = self.default(conf, args.env_name) if callable(self.default) else self.default
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 69, in <lambda>
    self.environment_variables.get("VIRTUALENV_SYSTEM_SITE_PACKAGES", "False"),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox_uv/_venv.py", line 184, in environment_variables
    env = super().environment_variables
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/runner.py", line 193, in environment_variables
    environment_variables = super().environment_variables
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/tox_env/api.py", line 351, in environment_variables
    result[key] = set_env.load(key)
                  ^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/set_env.py", line 90, in load
    result = self._replacer(raw, args)  # apply any replace options
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/jmusilek/test/tox-uv-fail/.direnv/python-3.12.8/lib/python3.12/site-packages/tox/config/loader/ini/__init__.py", line 83, in replacer
    raise HandledError(msg) from exception
tox.report.HandledError: replace failed in py313.setenv with Skip('could not find python interpreter with spec(s): cpython3.13')
  py39: FAIL code 2 (0.03 seconds)
  py310: OK (0.07 seconds)
  py311: OK (0.07 seconds)
  py312: OK (0.06 seconds)
  py313: FAIL code 2 (0.02 seconds)
  evaluation failed :( (0.32 seconds)

Minimal example

[tox]
minversion = 4.18.0
envlist =
    py39
    py310
    py311
    py312
    py313
skip_missing_interpreters = true

[testenv]
setenv =
    MYVAR = {env:MYVAR:{envsitepackagesdir}/something}
uv_python_preference = only-system
command = echo $MYVAR

This is enough to reproduce the issue, no python files are actually needed. You have to be missing interpreter for at least one of the Python versions listed in envlist.

@stinovlas stinovlas added the bug Something isn't working label Mar 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant