Repository navigation
Add support for Python 3.12 #6941
Description
Activity
- changed the title
[-]Add support for Python 3.11[/-][+]Add support for Python 3.12[/+]on Feb 11, 2023 - pinned this issue
on Apr 11, 2023 deadsnakes decided not to support Python 3.12 on Bionic, the last 32-bit Ubuntu. We've discussed dropping support for 32-bit briefly before, so the simplest thing is for us to not release 32-bit Linux Python 3.12 wheels.
That should be fine.
Looking at a couple of projects:
We (NumPy) will continue to test (but not provide wheels for) 32-bit linux.
We [pyca/cryptography] stopped testing on 32-bit Linux, and stopped building 32-bit Linux wheels several years ago, and that produced no problems.
https://discuss.python.org/t/dropping-32-bit-packages/5476/16?u=hugovk
Looking at some numbers, here's a week's worth of Pillow file downloads from PyPI, fetched using https://github.com/ofek/pypinfo:
pypinfo --days 7 --limit 1000 pillow version fileFiltering for the most recent release, for Python 3.11, and Linux (
grep "9.5.0-cp311.*linux" 1000.txt) shows a very small number for i686:version file download_count percentage 9.5.0 Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl 219,628 91.71 % 9.5.0 Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl 7,407 3.09 % 9.5.0 Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl 5,810 2.43 % 9.5.0 Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 5,233 2.19 % 9.5.0 Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl 771 0.32 % 9.5.0 Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 405 0.17 % 9.5.0 Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl 226 0.09 % total 239,480 100.00 % Whilst we're here, Windows is quite low for win32:
version file download_count percentage 9.5.0 Pillow-9.5.0-cp311-cp311-win_amd64.whl 150,653 98.82 % 9.5.0 Pillow-9.5.0-cp311-cp311-win32.whl 1,580 1.04 % 9.5.0 Pillow-9.5.0-cp311-cp311-win_arm64.whl 225 0.15 % total 152,458 100.00 % I'd say just drop the 32 bit builds, especially for new pythons.
Reacted by Hugo van KemenadeSounds good.
So let's not create 32-bit wheels for 3.12. Do we still want to test 32-bit for 3.12?
The next Pillow 10.0.0 is a major bump so it's a good opportunity to drop things:
-
For 3.11, shall we drop 32-bit wheels and/or testing?
-
And older ones, 3.10-3.8?
For Linux, the
*i686.whlnumbers are very low for all versions (0.01% - 0.09%):Details
version file download_count percentage 9.5.2 Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl 219,628 91.71 % 9.5.2 Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl 7,407 3.09 % 9.5.2 Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl 5,810 2.43 % 9.5.2 Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 5,233 2.19 % 9.5.2 Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl 771 0.32 % 9.5.2 Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 405 0.17 % 9.5.2 Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl 226 0.09 % total 239,480 100 % 9.5.2 Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl 788,288 91.90 % 9.5.2 Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 46,996 5.48 % 9.5.2 Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl 13,842 1.61 % 9.5.2 Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl 6,597 0.77 % 9.5.2 Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl 934 0.11 % 9.5.2 Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 882 0.10 % 9.5.2 Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl 224 0.03 % total 857,763 100 % 9.5.2 Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl 910,193 84.64 % 9.5.2 Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 137,166 12.75 % 9.5.2 Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl 15,810 1.47 % 9.5.2 Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 7,066 0.66 % 9.5.2 Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl 4,184 0.39 % 9.5.2 Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl 542 0.05 % 9.5.2 Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl 462 0.04 % total 1,075,423 100 % 9.5.2 Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl 924,301 51.40 % 9.5.2 Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 856,048 47.60 % 9.5.2 Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 7,569 0.42 % 9.5.2 Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl 7,523 0.42 % 9.5.2 Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl 2,343 0.13 % 9.5.2 Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl 355 0.02 % 9.5.2 Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl 241 0.01 % total 1,798,380 100 % For Windows,
*win32.whlare a bigger proportion but still low (0.90% - 5.63%):Details
version file download_count percentage 9.5.2 Pillow-9.5.0-cp311-cp311-win_amd64.whl 150,653 98.82 % 9.5.2 Pillow-9.5.0-cp311-cp311-win32.whl 1,580 1.04 % 9.5.2 Pillow-9.5.0-cp311-cp311-win_arm64.whl 225 0.15 % total 152,458 100.00 % 9.5.2 Pillow-9.5.0-cp310-cp310-win_amd64.whl 198,304 99.10 % 9.5.2 Pillow-9.5.0-cp310-cp310-win32.whl 1,801 0.90 % total 200,105 100.00 % 9.5.2 Pillow-9.5.0-cp39-cp39-win_amd64.whl 89,231 98.12 % 9.5.2 Pillow-9.5.0-cp39-cp39-win32.whl 1,710 1.88 % total 90,941 100.00 % 9.5.2 Pillow-9.5.0-cp38-cp38-win_amd64.whl 71,998 94.37 % 9.5.2 Pillow-9.5.0-cp38-cp38-win32.whl 4,298 5.63 % total 76,296 100 % -
python-pillow/pillow-wheels#383 has added Python 3.12 macOS and Linux wheels, excluding 32-bit wheels, and albeit without fribidi, harfbuzz and raqm on macOS until #7167 is resolved.
Pillow-9.5.0 works well on Python 3.12.0b2 on Windows:
>py -3.12 -X dev -m pytest -v Tests ======================================================================================================= test session starts ======================================================================================================== platform win32 -- Python 3.12.0b2, pytest-7.3.1, pluggy-1.0.0 -- X:\Python312\python.exe cachedir: .pytest_cache -------------------------------------------------------------------- Pillow 9.5.0 Python 3.12.0b2 (tags/v3.12.0b2:e6c0efa, Jun 6 2023, 15:37:48) [MSC v.1935 64 bit (AMD64)] -------------------------------------------------------------------- Python modules loaded from X:\Python312\Lib\site-packages\PIL Binary modules loaded from X:\Python312\Lib\site-packages\PIL -------------------------------------------------------------------- --- PIL CORE support ok, compiled for 9.5.0 --- TKINTER support ok, loaded 8.6 --- FREETYPE2 support ok, loaded 2.13.0 --- LITTLECMS2 support ok, loaded 2.14 --- WEBP support ok, loaded 1.3.0 --- WEBP Transparency support ok --- WEBPMUX support ok --- WEBP Animation support ok --- JPEG support ok, compiled for libjpeg-turbo 2.1.92 --- OPENJPEG (JPEG2000) support ok, loaded 2.5.0 --- ZLIB (PNG/ZIP) support ok, loaded 1.2.13 --- LIBTIFF support ok, loaded 4.5.0 --- RAQM (Bidirectional Text) support ok, loaded 0.10.0, fribidi 1.0.12, harfbuzz 7.3.0 *** LIBIMAGEQUANT (Quantization method) support not installed *** XCB (X protocol) support not installed -------------------------------------------------------------------- rootdir: D:\Build\Pillow\Pillow-9.5.0 configfile: setup.cfg plugins: timeout-2.1.0 collected 3077 items / 2 skipped Tests/test_000_sanity.py::test_sanity PASSED [ 0%] Tests/test_binary.py::test_standard PASSED [ 0%] Tests/test_binary.py::test_little_endian PASSED [ 0%] Tests/test_binary.py::test_big_endian PASSED [ 0%] Tests/test_bmp_reference.py::test_bad PASSED [ 0%] Tests/test_bmp_reference.py::test_questionable PASSED [ 0%] Tests/test_bmp_reference.py::test_good PASSED [ 0%] Tests/test_box_blur.py::test_imageops_box_blur PASSED [ 0%] Tests/test_box_blur.py::test_color_modes PASSED [ 0%] Tests/test_box_blur.py::test_radius_0 PASSED [ 0%] Tests/test_box_blur.py::test_radius_0_02 PASSED [ 0%] Tests/test_box_blur.py::test_radius_0_05 PASSED [ 0%] Tests/test_box_blur.py::test_radius_0_1 PASSED [ 0%] Tests/test_box_blur.py::test_radius_0_5 PASSED [ 0%] Tests/test_box_blur.py::test_radius_1 PASSED [ 0%] Tests/test_box_blur.py::test_radius_1_5 PASSED [ 0%] Tests/test_box_blur.py::test_radius_bigger_then_half PASSED [ 0%] Tests/test_box_blur.py::test_radius_bigger_then_width PASSED [ 0%] Tests/test_box_blur.py::test_extreme_large_radius PASSED [ 0%] Tests/test_box_blur.py::test_two_passes PASSED [ 0%] Tests/test_box_blur.py::test_three_passes PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_wrong_args PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_correct_args PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_wrong_mode PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_correct_mode PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_identities PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_identities_4_channels PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_copy_alpha_channel PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_channels_order PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DCoreAPI::test_overflow PASSED [ 0%] Tests/test_color_lut.py::TestColorLut3DFilter::test_wrong_args PASSED <snip> Tests/test_shell_injection.py::TestShellInjection::test_load_djpeg_filename SKIPPED (Requires Unix or macOS) [ 99%] Tests/test_shell_injection.py::TestShellInjection::test_save_cjpeg_filename SKIPPED (Requires Unix or macOS) [ 99%] Tests/test_shell_injection.py::TestShellInjection::test_save_netpbm_filename_bmp_mode SKIPPED (Netpbm not available) [ 99%] Tests/test_shell_injection.py::TestShellInjection::test_save_netpbm_filename_l_mode SKIPPED (Netpbm not available) [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash_1.tif] SKIPPED (test image not found) [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash_2.tif] SKIPPED (test image not found) [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-2020-10-test.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-0c7e0e8e11ce787078f00b5b0ca409a167f070e0.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-0e16d3bfb83be87356d026d66919deaefca44dac.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-1152ec2d1a1a71395b6f2ce6721c38924d025bf3.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-1185209cf7655b5aed8ae5e77784dfdd18ab59e9.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-338516dbd2f0e83caddb8ce256c22db3bd6dc40f.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-4f085cc12ece8cde18758d42608bed6a2a2cfb1c.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-86214e58da443d2b80820cff9677a38a33dcbbca.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-f46f5b2f43c370fe65706c11449f567ecc345e74.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-63b1dffefc8c075ddc606c0a2f5fdc15ece78863.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-74d2a78403a5a59db1fb0a2b8735ac068a75f6e3.tif] PASSED [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-81154a65438ba5aaeca73fd502fa4850fbde60f8.tif] SKIPPED (test image not found) [ 99%] Tests/test_tiff_crashes.py::test_tiff_crashes[Tests/images/crash-0da013a13571cc8eb457a39fee8db18f8a3c7127.tif] PASSED [ 99%] Tests/test_tiff_ifdrational.py::test_sanity PASSED [ 99%] Tests/test_tiff_ifdrational.py::test_ranges PASSED [ 99%] Tests/test_tiff_ifdrational.py::test_nonetype PASSED [ 99%] Tests/test_tiff_ifdrational.py::test_ifd_rational_save PASSED [ 99%] Tests/test_util.py::test_is_path PASSED [ 99%] Tests/test_util.py::test_path_obj_is_path PASSED [ 99%] Tests/test_util.py::test_is_not_path PASSED [ 99%] Tests/test_util.py::test_is_directory PASSED [ 99%] Tests/test_util.py::test_is_not_directory PASSED [ 99%] Tests/test_util.py::test_deferred_error PASSED [ 99%] Tests/test_webp_leaks.py::TestWebPLeaks::test_leak_load SKIPPED (Requires Unix or macOS) [100%] ========================================================================================================= warnings summary ========================================================================================================= Tests/test_file_wmf.py::test_load_raw Tests/test_file_wmf.py::test_load X:\Python312\Lib\site-packages\PIL\ImageFile.py:349: ResourceWarning: unclosed file <_io.BufferedReader name='Tests/images/drawing.emf'> self.__dict__ = image.__dict__ Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. Tests/test_file_wmf.py::test_load_raw Tests/test_file_wmf.py::test_load_set_dpi X:\Python312\Lib\site-packages\PIL\ImageFile.py:349: ResourceWarning: unclosed file <_io.BufferedReader name='Tests/images/drawing.wmf'> self.__dict__ = image.__dict__ Enable tracemalloc to get traceback where the object was allocated. See https://docs.pytest.org/en/stable/h [Pillow-9.5.0-cp312-win.zip](https://github.com/python-pillow/Pillow/files/11671080/Pillow-9.5.0-cp312-win.zip) ow-to/capture-warnings.html#resource-warnings for more info. -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html ===================================================================================================== short test summary info ====================================================================================================== SKIPPED [1] Tests\test_pyroma.py:5: Pyroma not installed SKIPPED [1] Tests\oss-fuzz\test_fuzzers.py:11: Fuzzer is linux only SKIPPED [1] Tests\test_features.py:68: libimagequant not available SKIPPED [1] Tests\test_file_gif.py:334: Netpbm not available SKIPPED [1] Tests\test_file_gif.py:345: Netpbm not available SKIPPED [4] Tests\test_file_jpeg2k.py:344: Extra image files not installed SKIPPED [1] Tests\test_file_msp.py:57: Extra image files not installed SKIPPED [1] Tests\test_file_msp.py:70: Even More Extra image files not installed SKIPPED [1] Tests\test_file_png.py:785: Requires Unix or macOS SKIPPED [1] Tests\test_file_sun.py:34: Extra image files not installed SKIPPED [1] Tests\test_file_tiff.py:787: Extra image files not installed SKIPPED [1] Tests\test_font_leaks.py:20: Requires Unix or macOS SKIPPED [1] Tests\test_font_leaks.py:31: Requires Unix or macOS SKIPPED [1] Tests\test_image.py:211: Test requires opening tempfile twice SKIPPED [1] Tests\test_image_fromqimage.py:44: Qt bindings are not installed SKIPPED [1] Tests\test_image_fromqimage.py:49: Qt bindings are not installed SKIPPED [1] Tests\test_image_fromqimage.py:54: Qt bindings are not installed SKIPPED [1] Tests\test_image_fromqimage.py:59: Qt bindings are not installed SKIPPED [1] Tests\test_image_fromqimage.py:64: Qt bindings are not installed SKIPPED [1] Tests\test_image_quantize.py:21: libimagequant not available SKIPPED [1] Tests\test_imagedraw.py:1002: failing SKIPPED [2] Tests\test_imagefont.py:546: requires Unix or macOS SKIPPED [2] Tests\test_imagefontctl.py:233: fails with this font SKIPPED [1] Tests\test_imagegrab.py:25: xcb not available SKIPPED [1] Tests\test_imagegrab.py:48: xcb not available SKIPPED [1] Tests\test_imageqt.py:20: Qt bindings are not installed SKIPPED [1] Tests\test_imageqt.py:49: Qt bindings are not installed SKIPPED [1] Tests\test_imageqt.py:63: Qt bindings are not installed SKIPPED [5] Tests\test_imageshow.py:44: Only run on CIs; hangs on Windows CIs SKIPPED [1] Tests\test_imageshow.py:82: IPython not installed SKIPPED [1] Tests\test_imageshow.py:94: Only run on CIs; hangs on Windows CIs SKIPPED [1] Tests\test_qt_image_qapplication.py:54: Qt bindings are not installed SKIPPED [5] Tests\test_qt_image_toqimage.py:19: Qt bindings are not installed SKIPPED [1] Tests\test_shell_injection.py:25: Requires Unix or macOS SKIPPED [1] Tests\test_shell_injection.py:34: Requires Unix or macOS SKIPPED [1] Tests\test_shell_injection.py:39: Netpbm not available SKIPPED [1] Tests\test_shell_injection.py:45: Netpbm not available SKIPPED [3] Tests\test_tiff_crashes.py:50: test image not found SKIPPED [1] Tests\test_webp_leaks.py:15: Requires Unix or macOS XFAIL Tests/test_file_palm.py::test_p_mode - Palm P image is wrong XFAIL Tests/test_image_access.py::TestEmbeddable::test_embeddable - failing test XFAIL Tests/test_image_resample.py::TestCoreResampleAlphaCorrect::test_levels_rgba - Current implementation isn't precise enough XFAIL Tests/test_image_resample.py::TestCoreResampleAlphaCorrect::test_levels_la - Current implementation isn't precise enough ================================================================================ 3021 passed, 54 skipped, 4 xfailed, 4 warnings in 69.91s (0:01:09) ================================================================================Reacted by Hugo van Kemenadere: #6941 (comment)
I suggest we drop all the 32-bit wheels and testing. If there's a lot of demand or very good reason, we can always add something back (e.g. 3.8 on Windows has a slightly larger percentage).
Sorry, I'm on holiday here so this is a little late --
I'm not sure if there are any remaining platforms were 32 bit is really a going concern, but I'd view it as a minor platform in the same way that we support S390 or Big Endian -- good to keep compatibility with from a correctness POV, but we're not building wheels. There's nothing in 32 bit to my knowledge where dropping it really streamlines our code.
Okay, let's keep some representative testing of 32-bit on the CI. I'd say we can leave the docker-images changes as is.
There's nothing in 32 bit to my knowledge where dropping it really streamlines our code.
Yeah, #7228 was mostly test bits and pieces.
I've created #7234 to restore 32-bit support, without restoring most of the CI jobs. I've only restored 32-bit Debian 12.
Reacted by Hugo van KemenadeWe later also restored a Windows 32-bit job - #7234 (comment)
Reacted by Hugo van KemenadePillow 10.0.0 has now been released with Python 3.12 beta wheels.
Reacted by Hugo van Kemenade- added 2 commits that reference this issue
on Sep 18, 2023 Pillow 10.1.0 has now been released with Python 3.12 final wheels.
Reacted by Alexander Piskun, Hugo van Kemenade and Sakti Dwi Cahyono- unpinned this issue
on Oct 31, 2023 I suggest we drop all the 32-bit wheels and testing. If there's a lot of demand or very good reason, we can always add something back (e.g. 3.8 on Windows has a slightly larger percentage).
Windows 32-bit wheels have now been restored in #7580
- added a commit that references this issue
on Jun 4, 2024 Hi!
is there a plan to release a wheel for Pillow 9.5 with python 3.12? Plone, for example, uses Pillow and supports python 3.12 but still reference Pillow 9.5.0. Thanks for any info!Hi. There isn't a plan to do so, no. In general, we would encourage you to upgrade to the latest version of Pillow to receive recent security fixes.
- added a commit that references this issue
on Sep 21, 2024
Tracking issue for getting the pieces into place to:
TODO
Update https://github.com/python-pillow/pillow-wheelshttps://github.com/python-pillow/Pillow/tree/main/wheelssetup.pyversion check, add totox.ini, update Python support tableNon-blockers
3.12-devwith3.12on GHA:3.12-devshould pick up 3.12.0 on-flight fairly soon after release, and be added to cached images later3.11with3.12on AppVeyor: Updated AppVeyor to Python 3.12 #75083.11with3.12on Travis CI: Update Travis CI to Python 3.12 and Ubuntu 22.04 Jammy Jellyfish #7501References: