Skip to content

Allow python 3.14 in dev environments #373

@NickCrews

Description

@NickCrews

What happens?

I wanted to try making a proof of concept for #370. To do this, I need a python 3.14 dev environment. So I started following https://duckdb.org/docs/stable/dev/building/python, checked out the 1.5 branch (which looks like where development is happening), and ran uv sync --no-install-project --python 3.14 (on macOS). This gave:

Error Log

$ uv sync --no-install-project --python 3.14
Using CPython 3.14.2 interpreter at: /opt/homebrew/opt/[email protected]/bin/python3.14
Removed virtual environment at: .venv
Creating virtual environment at: .venv
  × No solution found when resolving dependencies for split (markers: python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform
  │ == 'win32'):
  ╰─▶ Because only the following versions of torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32')
      or (python_full_version < '3.14' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and
      platform_machine == 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform ==
      'win32') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'win32')} are available:
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}<=2.2.2
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.2.2+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.3.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.3.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.3.1
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.3.1+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.4.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.4.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.4.1
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.4.1+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.5.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.5.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.5.1
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.5.1+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.6.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.6.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.7.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.7.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.7.1
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.7.1+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.8.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.8.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.9.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.9.0+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.9.1
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.9.1+cpu
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.10.0
          torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14' and
      sys_platform != 'darwin' and sys_platform != 'win32')}==2.10.0+cpu
      and torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32') or (python_full_version < '3.14' and
      platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_machine == 'x86_64' and sys_platform
      == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.14'
      and sys_platform != 'darwin' and sys_platform != 'win32')}>=2.2.2 has no `python_full_version >= '3.11' and platform_machine == 'ARM64' and
      sys_platform == 'win32'`-compatible wheels, we can conclude that torch{(python_full_version >= '3.12' and python_full_version < '3.14' and
      sys_platform == 'win32') or (python_full_version < '3.14' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version
      < '3.13' and platform_machine == 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and
      sys_platform == 'win32') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'win32')}>=2.2.2 cannot be used.
      And because duckdb:dev depends on torch{(python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32')
      or (python_full_version < '3.14' and platform_machine != 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.13' and
      platform_machine == 'x86_64' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform ==
      'win32') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'win32')}>=2.2.2 and your project requires duckdb:dev,
      we can conclude that your project's requirements are unsatisfiable.

      hint: The resolution failed for an environment that is not the current one, consider limiting the environments with `tool.uv.environments`.

Which if I am interpreting right, is caused by this line:

"torch>=2.2.2; python_version < '3.14' and ( sys_platform != 'darwin' or platform_machine != 'x86_64' or python_version < '3.13' ) and ( sys_platform != 'win32' or platform_machine != 'ARM64' or python_version > '3.11' )",

in the test dependency group in our pyproject.toml

If I understand pytorch/pytorch#156856 and https://github.com/pytorch/pytorch/releases/tag/v2.10.0 correctly, then pytorch>=2.10.0 should work with python 3.14. Can we adjust our above version requirement so that my UV successfully pulls in this new pytorch version, so that I can use 3.14 for dev?

To Reproduce

(on MacOS):

uv sync --no-install-project --python 3.14

I'm not sure if there are uv flags where you can mock being on macOS? I tried all variations of

uv sync --no-install-project --python 3.14 --python-platform [all of linux, macos, windows]

and I got a similar error for all of them. So not sure if I am providing the flags wrong, or if we truly can't resolve the deps on all platforms.

OS:

OSX 26.3.1

DuckDB Package Version:

main

Python Version:

3.14

Full Name:

Nick Crews

Affiliation:

Ship Creek Group

What is the latest build you tested with? If possible, we recommend testing with the latest nightly build.

I have tested with a source build

Did you include all relevant data sets for reproducing the issue?

Yes

Did you include all code required to reproduce the issue?

  • Yes, I have

Did you include all relevant configuration to reproduce the issue?

  • Yes, I have

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions