diff --git a/.env b/.env index 6051a433873..3b32979e889 100644 --- a/.env +++ b/.env @@ -98,5 +98,5 @@ VCPKG="9b965a116838c6cdcd36bca60d1b81b030c8ab8d" # 2026.05.27 (not release, u # ci/docker/python-*-windows-*.dockerfile or the vcpkg config. # This is a workaround for our CI problem that "archery docker build" doesn't # use pulled built images in dev/tasks/python-wheels/github.windows.yml. -PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-07-13 -PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-07-13 +PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-07-21 +PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-07-21 diff --git a/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile b/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile index 98295c91d0b..7c9b9f764a4 100644 --- a/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile +++ b/ci/docker/python-free-threaded-wheel-windows-test-vs2022.dockerfile @@ -27,7 +27,8 @@ FROM ${base} ARG python=3.14 # hadolint ignore=SC1072 -RUN (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.5") +RUN (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.5") & \ + (if "%python%"=="3.15" setx PYTHON_VERSION "3.15.0b4") SHELL ["powershell", "-NoProfile", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"] RUN $version = $env:PYTHON_VERSION; \ diff --git a/ci/docker/python-wheel-windows-test-vs2022.dockerfile b/ci/docker/python-wheel-windows-test-vs2022.dockerfile index fcb65ba2314..9ab1acc25ee 100644 --- a/ci/docker/python-wheel-windows-test-vs2022.dockerfile +++ b/ci/docker/python-wheel-windows-test-vs2022.dockerfile @@ -31,7 +31,8 @@ ARG python=3.11 RUN (if "%python%"=="3.11" setx PYTHON_VERSION "3.11.9" && setx PYTHON_CMD "py -3.11") & \ (if "%python%"=="3.12" setx PYTHON_VERSION "3.12.10" && setx PYTHON_CMD "py -3.12") & \ (if "%python%"=="3.13" setx PYTHON_VERSION "3.13.14" && setx PYTHON_CMD "py -3.13") & \ - (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.6" && setx PYTHON_CMD "py -3.14") + (if "%python%"=="3.14" setx PYTHON_VERSION "3.14.6" && setx PYTHON_CMD "py -3.14") & \ + (if "%python%"=="3.15" setx PYTHON_VERSION "3.15.0b4" && setx PYTHON_CMD "py -3.15") # hadolint ignore=DL3059 RUN choco install -r -y --pre --no-progress --force python --version=%PYTHON_VERSION% diff --git a/ci/scripts/install_python.sh b/ci/scripts/install_python.sh index f6502b1be8c..d87f5e4d7f2 100755 --- a/ci/scripts/install_python.sh +++ b/ci/scripts/install_python.sh @@ -29,7 +29,9 @@ versions=([3.11]=3.11.9 [3.12]=3.12.10 [3.13]=3.13.14 [3.14]=3.14.6 - [3.14t]=3.14.6) + [3.14t]=3.14.6 + [3.15]=3.15.0b4 + [3.15t]=3.15.0b4) if [ "$#" -ne 2 ]; then echo "Usage: $0 " @@ -78,7 +80,7 @@ EOF rm "$fname" python="/Library/Frameworks/Python.framework/Versions/${version}/bin/python${version}" - if [[ $2 == "3.14t" ]]; then + if [[ $2 == "3.14t" ]] || [[ $2 == "3.15t" ]]; then base_version="${version%t}" python="/Library/Frameworks/PythonT.framework/Versions/${base_version}/bin/python${base_version}t" fi diff --git a/ci/scripts/python_wheel_unix_test.sh b/ci/scripts/python_wheel_unix_test.sh index cb445611e23..14fccc05a78 100755 --- a/ci/scripts/python_wheel_unix_test.sh +++ b/ci/scripts/python_wheel_unix_test.sh @@ -47,7 +47,12 @@ export PYARROW_TEST_GANDIVA=OFF export PYARROW_TEST_GCS=${ARROW_GCS} export PYARROW_TEST_HDFS=ON export PYARROW_TEST_ORC=ON -export PYARROW_TEST_PANDAS=ON +# TODO: To be removed once pandas provides wheels for Python 3.15 +if python -c "import sys; sys.exit(0 if sys.version_info < (3, 15) else 1)"; then + export PYARROW_TEST_PANDAS=ON +else + export PYARROW_TEST_PANDAS=OFF +fi export PYARROW_TEST_PARQUET=ON export PYARROW_TEST_PARQUET_ENCRYPTION=ON export PYARROW_TEST_SUBSTRAIT=${ARROW_SUBSTRAIT} diff --git a/compose.yaml b/compose.yaml index 6809d6994b6..318627b6c25 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1178,7 +1178,7 @@ services: args: arch: ${ARCH} arch_short: ${ARCH_SHORT} - base: quay.io/pypa/manylinux_2_28_${ARCH_ALIAS}:2026.05.31-3 + base: quay.io/pypa/manylinux_2_28_${ARCH_ALIAS}:2026.07.19-1 manylinux: 2_28 python: ${PYTHON} python_abi_tag: ${PYTHON_ABI_TAG} @@ -1203,7 +1203,7 @@ services: args: arch: ${ARCH} arch_short: ${ARCH_SHORT} - base: quay.io/pypa/musllinux_1_2_${ARCH_ALIAS}:2026.05.31-3 + base: quay.io/pypa/musllinux_1_2_${ARCH_ALIAS}:2026.07.19-1 musllinux: 1_2 python: ${PYTHON} python_abi_tag: ${PYTHON_ABI_TAG} diff --git a/dev/release/verify-release-candidate.sh b/dev/release/verify-release-candidate.sh index a060901ea4b..59dbe102e7b 100755 --- a/dev/release/verify-release-candidate.sh +++ b/dev/release/verify-release-candidate.sh @@ -898,11 +898,11 @@ test_macos_wheels() { # apple silicon processor if [ "$(uname -m)" = "arm64" ]; then - local python_versions="3.11 3.12 3.13 3.14" + local python_versions="3.11 3.12 3.13 3.14 3.15" local platform_tags="macosx_12_0_arm64" local check_flight=OFF else - local python_versions="3.11 3.12 3.13 3.14" + local python_versions="3.11 3.12 3.13 3.14 3.15" local platform_tags="macosx_12_0_x86_64" fi diff --git a/dev/tasks/python-wheels/github.linux.yml b/dev/tasks/python-wheels/github.linux.yml index e9e36566ba8..23170149be3 100644 --- a/dev/tasks/python-wheels/github.linux.yml +++ b/dev/tasks/python-wheels/github.linux.yml @@ -42,7 +42,7 @@ jobs: {% endif %} PYTHON: "{{ python_version }}" PYTHON_ABI_TAG: "{{ python_abi_tag }}" - PYTHON_IMAGE_TAG: "{{ python_version }}" + PYTHON_IMAGE_TAG: "{{ python_image_tag }}" steps: {{ macros.github_checkout_arrow()|indent }} diff --git a/dev/tasks/tasks.yml b/dev/tasks/tasks.yml index 89d239a0a26..b9c71b8e2f7 100644 --- a/dev/tasks/tasks.yml +++ b/dev/tasks/tasks.yml @@ -138,11 +138,13 @@ tasks: ########################### Python Wheels ############################ -{% for python_version, python_tag, abi_tag in [("3.11", "cp311", "cp311"), - ("3.12", "cp312", "cp312"), - ("3.13", "cp313", "cp313"), - ("3.14", "cp314", "cp314"), - ("3.14", "cp314", "cp314t")] %} +{% for python_version, python_image_tag, python_tag, abi_tag in [("3.11", "3.11", "cp311", "cp311"), + ("3.12", "3.12", "cp312", "cp312"), + ("3.13", "3.13", "cp313", "cp313"), + ("3.14", "3.14", "cp314", "cp314"), + ("3.14", "3.14", "cp314", "cp314t"), + ("3.15", "3.15.0b4", "cp315", "cp315"), + ("3.15", "3.15.0b4", "cp315", "cp315t")] %} {############################## Wheel Linux ##################################} @@ -159,6 +161,7 @@ tasks: linux_wheel_version: "{{ version }}" python_abi_tag: "{{ abi_tag }}" python_version: "{{ python_version }}" + python_image_tag: "{{ python_image_tag }}" wheel_platform_tag: "{{ platform_tag }}" artifacts: - pyarrow-{no_rc_version}-{{ python_tag }}-{{ abi_tag }}-{{ platform_tag }}.whl @@ -495,7 +498,7 @@ tasks: UBUNTU: 22.04 image: ubuntu-cpp-emscripten -{% for python_version in ["3.11", "3.12", "3.13", "3.14"] %} +{% for python_version in ["3.11", "3.12", "3.13", "3.14", "3.15"] %} test-conda-python-{{ python_version }}: ci: github template: docker-tests/github.linux.yml diff --git a/python/pyproject.toml b/python/pyproject.toml index ab6f2e6061c..55218849d25 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -19,8 +19,11 @@ requires = [ "scikit-build-core >= 1.0", "cython >= 3.1", - # Needed for build-time stub docstring extraction - "libcst>=1.8.6", + # Needed for build-time stub docstring extraction. + # GH-50575: no libcst wheels for Python 3.15 yet and the source build + # requires a PyO3 version that doesn't support 3.15. Stub docstring + # extraction is currently disabled anyway (GH-49831), so skip it there. + "libcst>=1.8.6; python_version < '3.15'", "numpy>=1.25", "setuptools_scm[toml]>=8", ] @@ -42,6 +45,7 @@ classifiers = [ 'Programming Language :: Python :: 3.12', 'Programming Language :: Python :: 3.13', 'Programming Language :: Python :: 3.14', + 'Programming Language :: Python :: 3.15', 'Programming Language :: Python :: Free Threading :: 2 - Beta', ] maintainers = [ diff --git a/python/requirements-build.txt b/python/requirements-build.txt index 2ed711613b4..7f35cdaa6b5 100644 --- a/python/requirements-build.txt +++ b/python/requirements-build.txt @@ -1,6 +1,6 @@ build cython>=3.1 -libcst>=1.8.6 +libcst>=1.8.6; python_version < "3.15" numpy>=1.25 scikit-build-core>=1.0 setuptools_scm>=8 diff --git a/python/requirements-wheel-build.txt b/python/requirements-wheel-build.txt index 3d1d1c9b8db..9f06316f26a 100644 --- a/python/requirements-wheel-build.txt +++ b/python/requirements-wheel-build.txt @@ -1,7 +1,10 @@ build cython>=3.1 -# Needed for build-time stub docstring extraction -libcst>=1.8.6 +# Needed for build-time stub docstring extraction. +# GH-50575: no libcst wheels for Python 3.15 yet and the source build requires +# a PyO3 version that doesn't support 3.15. Stub docstring extraction is +# currently disabled anyway (GH-49831), so skip it there. +libcst>=1.8.6; python_version < "3.15" numpy>=2.0.0 scikit-build-core>=1.0 setuptools_scm diff --git a/python/requirements-wheel-test.txt b/python/requirements-wheel-test.txt index fb259db5798..cf40769aaae 100644 --- a/python/requirements-wheel-test.txt +++ b/python/requirements-wheel-test.txt @@ -18,4 +18,5 @@ numpy~=1.26.0; python_version == "3.12" numpy~=2.1.0; python_version == "3.13" numpy~=2.3.3; python_version >= "3.14" -pandas +# TODO: To be removed once pandas provides wheels for Python 3.15 +pandas; python_version < "3.15"