NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #80 most downloaded on PyPI
Command line tool for manipulating wheel files
Last release 1 months ago
11 Aug 2026
Release timing varies
gaps range from 2 weeks to 10 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
3 versions withdrawn
withdrawn after publishing
14 years old
84 releases · first in 2012
Added a --local-version option to wheel pack to add, replace, or remove a PEP 440 local version identifier from a wheel
--local-version option to wheel pack to add, replace, or remove a PEP 440 local version identifier from a wheel (#570)wheel convert unnecessarily upgrading compatible core metadata versions (#643)wheel tags producing invalid archives when retagging wheels whose entries use ZIP64, by dropping the central-directory ZIP64 extra field that is not valid in a local file header (#692)wheel convert writing the converted wheel outside the destination directory when the input archive contained a maliciously crafted project name or version with path separators (arbitrary file write / path traversal) (GHSA-vgq5-9859-3mmw)Added the wheel info subcommand to display metadata about wheel files without unpacking them
One column per quarter.
Fixed ImportError: cannot import name '_setuptools_logging' from 'wheel' when installed alongside an old version of setuptools and running the bdist_w
ImportError: cannot import name '_setuptools_logging' from 'wheel' when installed alongside an old version of setuptools and running the bdist_wheel command (#676)Fixed wheel unpack potentially altering the permissions of files outside of the destination tree with maliciously crafted wheels ( CVE-2026-24049 )
bdist_wheel command for compatibility with setuptools older than v70.1wheel.bdist_wheel now emits a FutureWarning instead of a DeprecationWarningwheel unpack potentially altering the permissions of files outside of the destination tree with maliciously crafted wheels (CVE-2026-24049)Temporarily restored the wheel.macosx_libfile module
wheel.macosx_libfile module (#659)The wheel.bdist_wheel module is now just an alias to setuptools.command.bdist_wheel , emitting a deprecation warning on import.
bdist_wheel setuptools command implementation and entry point. The wheel.bdist_wheel module is now just an alias to setuptools.command.bdist_wheel, emitting a deprecation warning on import.packaging in favor of a run-time dependency on itwheel.metadata module private (with a deprecation warning if it's importedwheel.cli package private (no deprecation warning)convert command with an empty description fieldFixed pure Python wheels converted from eggs and wininst files having the ABI tag in the file name
Projects are still advised to migrate away from the deprecated module and import the setuptools ' implementation explicitly. (PR by @abravalheri )
Refactored the convert command to not need setuptools to be installed
Don't configure setuptools logging unless running bdist_wheel
Added a redirection from wheel.bdist_wheel.bdist_wheel to setuptools.command.bdist_wheel.bdist_wheel to improve compatibility with setuptools' latest fixes.
Projects are still advised to migrate away from the deprecated module and import the setuptools' implementation explicitly. (PR by @abravalheri)
Deprecated the bdist_wheel module, as the code was migrated to setuptools itself
bdist_wheel module, as the code was migrated to setuptools itselfUpdated vendored packaging to 24.0
packaging to 24.0Allowed removing build tag with wheel tags --build ""
wheel tags --build ""wheel pack and wheel tags writing updated WHEEL fields after a blank line, causing other tools to ignore themwheel pack and wheel tags writing WHEEL with CRLF line endings or a mix of CRLF and LFwheel pack --build-number "" not removing build tag from WHEEL (above changes by Benjamin Gilbert)Updated vendored packaging to 23.2
packaging to 23.2- Fixed platform tag detection for GraalPy and 32-bit python running on an aarch64 kernel (PR by Matthieu Darbois)
Fixed platform tag detection for GraalPy and 32-bit python running on an aarch64 kernel (PR by Matthieu Darbois)
Fixed wheel tags to not list directories in RECORD files (PR by Mike Taves)
Fixed ABI tag generation for GraalPy (PR by Michael Simacek)
- Fixed naming of the data_dir directory in the presence of local version segment given via egg_info.tag_build (PR by Anderson Bravalheri)
Fixed naming of the data_dir directory in the presence of local version segment given via egg_info.tag_build (PR by Anderson Bravalheri)
Fixed version specifiers in Requires-Dist being wrapped in parentheses
- Fixed warning on Python 3.12 about onerror deprecation. (PR by Henry Schreiner)
Added full support of the build tag syntax to wheel tags (you can now set a build tag like 123mytag )
Fixed warning on Python 3.12 about onerror deprecation. (PR by Henry Schreiner)
Support testing on Python 3.12 betas (PR by Ewout ter Hoeven)
- Fixed DeprecationWarning about the use of the deprecated pkg_resources API (PR by Thomas Grainger)
Added a wheel tags command to modify tags on an existing wheel (PR by Henry Schreiner)
Updated vendored packaging to 23.0
wheel unpack now preserves the executable attribute of extracted files
Fixed spaces in platform names not being converted to underscores (PR by David Tucker)
Fixed RECORD files in generated wheels missing the regular file attribute
Fixed DeprecationWarning about the use of the deprecated pkg_resources API (PR by Thomas Grainger)
Wheel now uses flit-core as a build backend (PR by Henry Schreiner)
- Fixed PKG-INFO conversion in bdist_wheel mangling UTF-8 header values in METADATA (PR by Anderson Bravalheri)
Fixed PKG-INFO conversion in bdist_wheel mangling UTF-8 header values in METADATA (PR by Anderson Bravalheri)
- Fixed install failure when used with --no-binary , reported on Ubuntu 20.04, by removing setup_requires from setup.cfg
Fixed install failure when used with --no-binary , reported on Ubuntu 20.04, by removing setup_requires from setup.cfg
- Fixed regression introduced in v0.38.1 which broke parsing of wheel file names with multiple platform tags
Fixed regression introduced in v0.38.1 which broke parsing of wheel file names with multiple platform tags
- Removed install dependency on setuptools
Removed install dependency on setuptools
The future-proof fix in 0.36.0 for converting PyPy’s SOABI into an ABI tag was faulty. Fixed so that future changes in the SOABI will not change the tag.
- Dropped support for Python < 3.7
Dropped support for Python < 3.7
Updated vendored packaging to 21.3
Replaced all uses of distutils with setuptools
The handling of license_files (including glob patterns and default values) is now delegated to setuptools>=57.0.0 (#466). The package dependencies were updated to reflect this change.
Fixed potential DoS attack via the WHEEL_INFO_RE regular expression
Fixed ValueError: ZIP does not support timestamps before 1980 when using SOURCE_DATE_EPOCH=0 or when on-disk timestamps are earlier than 1980-01-01. Such timestamps are now changed to the minimum value before packaging.
- Fixed wheel pack duplicating the WHEEL contents when the build number has changed
Fixed wheel pack duplicating the WHEEL contents when the build number has changed (#415)
Fixed parsing of file names containing commas in RECORD (PR by Hood Chatham)
- Added official Python 3.10 support
Added official Python 3.10 support
Updated vendored packaging library to v20.9
- Updated vendored packaging library to v20.8
Updated vendored packaging library to v20.8
Fixed wheel sdist missing LICENSE.txt
Don’t use default macos/arm64 deployment target in calculating the platform tag for fat binaries (PR by Ronald Oussoren)
- Fixed AssertionError when MACOSX_DEPLOYMENT_TARGET was set to 11 (PR by Grzegorz Bokota and François-Xavier Coudert)
Fixed AssertionError when MACOSX_DEPLOYMENT_TARGET was set to 11 (PR by Grzegorz Bokota and François-Xavier Coudert)
Fixed regression introduced in 0.36.0 on Python 2.7 when a custom generator name was passed as unicode (Scikit-build) ( TypeError: 'unicode' does not have the buffer interface )
- Added official Python 3.9 support
Added official Python 3.9 support
Updated vendored packaging library to v20.7
Switched to always using LF as line separator when generating WHEEL files (on Windows, CRLF was being used instead)
The ABI tag is taken from the sysconfig SOABI value. On PyPy the SOABI value is pypy37-pp73 which is not compliant with PEP 3149, as it should have both the API tag and the platform tag. This change future-proofs any change in PyPy’s SOABI tag to make sure only the ABI tag is used by wheel.
Fixed regression and test for bdist_wheel --plat-name . It was ignored for C extensions in v0.35, but the regression was not detected by tests.
- Replaced install dependency on packaging with a vendored copy of its tags module
Replaced install dependency on packaging with a vendored copy of its tags module
Fixed bdist_wheel not working on FreeBSD due to mismatching platform tag name (it was not being converted to lowercase)
- Switched to the packaging library for computing wheel tags
Switched to the packaging library for computing wheel tags
Fixed a resource leak in WheelFile.open() (PR by Jon Dufresne)
- Fixed installation of wheel from sdist on environments without Unicode file name support
Fixed installation of wheel from sdist on environments without Unicode file name support
- Fixed installation of wheel from sdist which was broken due to a chicken and egg problem with PEP 517 and setuptools_scm
Fixed installation of wheel from sdist which was broken due to a chicken and egg problem with PEP 517 and setuptools_scm
- Added automatic platform tag detection for macOS binary wheels (PR by Grzegorz Bokota)
Dropped Python 3.4 support
Added automatic platform tag detection for macOS binary wheels (PR by Grzegorz Bokota)
Added the --compression= option to the bdist_wheel command
Fixed PyPy tag generation to work with the updated semantics (#328)
Updated project packaging and testing configuration for PEP 517
Moved the contents of setup.py to setup.cfg
Fixed duplicate RECORD file when using wheel pack on Windows
Fixed bdist_wheel failing at cleanup on Windows with a read-only source tree
Fixed wheel pack not respecting the existing build tag in WHEEL
Switched the project to use the “src” layout
Switched to setuptools_scm for versioning
- Fixed regression from 0.33.5 that broke building binary wheels against the limited ABI
Fixed regression from 0.33.5 that broke building binary wheels against the limited ABI
Fixed egg2wheel compatibility with the future release of Python 3.10 (PR by Anthony Sottile)
- Don’t add the m ABI flag to wheel names on Python 3.8 (PR by rdb)
Don’t add the m ABI flag to wheel names on Python 3.8 (PR by rdb)
Updated MANIFEST.in to include many previously omitted files in the sdist
- Reverted PR #289 (adding directory entries to the wheel file) due to incompatibility with distlib.wheel
Reverted PR #289 (adding directory entries to the wheel file) due to incompatibility with distlib.wheel
- Fixed the --build-number option for wheel pack not being applied
Fixed the --build-number option for wheel pack not being applied
- Added the --build-number option to the wheel pack command
Added the --build-number option to the wheel pack command
Fixed bad shebangs sneaking into wheels
Fixed documentation issue with wheel pack erroneously being called wheel repack
Fixed filenames with “bad” characters (like commas) not being quoted in RECORD (PR by Paul Moore)
Sort requirements extras to ensure deterministic builds (PR by PoncinMatthieu)
Forced inplace = False when building a C extension for the wheel
- Fixed compatibility with Python 2.7.0 – 2.7.3
Fixed compatibility with Python 2.7.0 – 2.7.3
Fixed handling of direct URL requirements with markers (PR by Benoit Pierre)
- Fixed build number appearing in the .dist-info directory name
Fixed build number appearing in the .dist-info directory name
Made wheel file name parsing more permissive
Fixed wrong Python tag in wheels converted from eggs (PR by John T. Wodder II)
- Fixed AttributeError: 'Requirement' object has no attribute 'url' on setuptools/pkg_resources versions older than 18.8 (PR by Benoit Pierre)
Fixed AttributeError: 'Requirement' object has no attribute 'url' on setuptools/pkg_resources versions older than 18.8 (PR by Benoit Pierre)
Fixed AttributeError: 'module' object has no attribute 'algorithms_available' on Python < 2.7.9 (PR by Benoit Pierre)
Fixed permissions on the generated .dist-info/RECORD file
- Deprecated the license_file option
Removed wheel signing and verifying features
Removed the “wheel install” and “wheel installscripts” commands
Added the wheel pack command
Allowed multiple license files to be specified using the license_files option
Deprecated the license_file option
Eliminated duplicate lines from generated requirements in .dist-info/METADATA (thanks to Wim Glenn for the contribution)
Fixed handling of direct URL specifiers in requirements (PR by Benoit Pierre)
Fixed canonicalization of extras (PR by Benoit Pierre)
Warn when the deprecated [wheel] section is used in setup.cfg (PR by Jon Dufresne)
- Fixed arch as None when converting eggs to wheels
Fixed arch as None when converting eggs to wheels
- Fixed displaying of errors on Python 3
Fixed displaying of errors on Python 3
Fixed single digit versions in wheel files not being properly recognized
Fixed wrong character encodings being used (instead of UTF-8) to read and write RECORD (this sometimes crashed bdist_wheel too)
Enabled Zip64 support in wheels by default
- Added py-limited-api {cp32|cp33|cp34|…} flag to produce cpNN.abi3.{arch}
Added py-limited-api {cp32|cp33|cp34|…} flag to produce cpNN.abi3.{arch}
Nothing published for this version
- Fix compression type of files in archive (Issue #155, Pull Request #62, thanks Xavier Fernandez)
Fix compression type of files in archive (Issue #155, Pull Request #62, thanks Xavier Fernandez)
- Fix file modes in archive (Issue #154)
Fix file modes in archive (Issue #154)
- Support forcing a platform tag using --plat-name on pure-Python wheels, as well as nonstandard platform tags on non-pure wheels (Pull Request #60, I
Support forcing a platform tag using --plat-name on pure-Python wheels, as well as nonstandard platform tags on non-pure wheels (Pull Request #60, Issue #144, thanks Andrés Díaz)
Add SOABI tags to platform-specific wheels built for Python 2.X (Pull Request #55, Issue #63, Issue #101)
Support reproducible wheel files, wheels that can be rebuilt and will hash to the same values as previous builds (Pull Request #52, Issue #143, thanks Barry Warsaw)
Support for changes in keyring >= 8.0 (Pull Request #61, thanks Jason R. Coombs)
Use the file context manager when checking if dependency_links.txt is empty, fixes problems building wheels under PyPy on Windows (Issue #150, thanks Cosimo Lupo)
Don’t attempt to (recursively) create a build directory ending with .. (invalid on all platforms, but code was only executed on Windows) (Issue #91)
Added the PyPA Code of Conduct (Pull Request #56)
- Fix multiple entrypoint comparison failure on Python 3 (Issue #148)
Fix multiple entrypoint comparison failure on Python 3 (Issue #148)
- Add Python 3.5 to tox configuration
Add Python 3.5 to tox configuration
Deterministic (sorted) metadata
Fix tagging for Python 3.5 compatibility
Support py2-none-‘arch’ and py3-none-‘arch’ tags
Treat data-only wheels as pure
Write to temporary file and rename when using wheel install –force
- The python tag used for pure-python packages is now .pyN (major version only). This change actually occurred in 0.23.0 when the –python-tag option w
The python tag used for pure-python packages is now .pyN (major version only). This change actually occurred in 0.23.0 when the –python-tag option was added, but was not explicitly mentioned in the changelog then.
wininst2wheel and egg2wheel removed. Use “wheel convert [archive]” instead.
Wheel now supports setuptools style conditional requirements via the extras_require={} syntax. Separate ‘extra’ names from conditions using the : character. Wheel’s own setup.py does this. (The empty-string extra is the same as install_requires.) These conditional requirements should work the same whether the package is installed by wheel or by setup.py.
- Compatibility tag flags added to the bdist_wheel command
Compatibility tag flags added to the bdist_wheel command
sdist should include files necessary for tests
‘wheel convert’ can now also convert unpacked eggs to wheel
Rename pydist.json to metadata.json to avoid stepping on the PEP
The –skip-scripts option has been removed, and not generating scripts is now the default. The option was a temporary approach until installers could generate scripts themselves. That is now the case with pip 1.5 and later. Note that using pip 1.4 to install a wheel without scripts will leave the installation without entry-point wrappers. The “wheel install-scripts” command can be used to generate the scripts in such cases.
Thank you contributors
- Include entry_points.txt, scripts a.k.a. commands, in experimental pydist.json
Include entry_points.txt, scripts a.k.a. commands, in experimental pydist.json
Improved test_requires parsing
Python 2.6 fixes, “wheel version” command courtesy pombredanne
- Pregenerated scripts are the default again.
Pregenerated scripts are the default again.
“setup.py bdist_wheel –skip-scripts” turns them off.
setuptools is no longer a listed requirement for the ‘wheel’ package. It is of course still required in order for bdist_wheel to work.
“python -m wheel” avoids importing pkg_resources until it’s necessary.
- pymeta.json becomes pydist.json
pymeta.json becomes pydist.json
- Python 3 Unicode improvements
Python 3 Unicode improvements
- Support latest PEP-426 “pymeta.json” (json-format metadata)
Support latest PEP-426 “pymeta.json” (json-format metadata)
- Python 2.6 compatibility bugfix (thanks John McFarlane)
Python 2.6 compatibility bugfix (thanks John McFarlane)
Bugfix for C-extension tags for CPython 3.3 (using SOABI)
Bugfix for bdist_wininst converter “wheel convert”
Bugfix for dists where “is pure” is None instead of True or False
Python 3 fix for moving Unicode Description to metadata body
Include rudimentary API documentation in Sphinx (thanks Kevin Horn)
- Various improvements
Various improvements
- Changed the signature format to better comply with the current JWS spec. Breaks all existing signatures.
Changed the signature format to better comply with the current JWS spec. Breaks all existing signatures.
Include wheel unsign command to remove RECORD.jws from an archive.
Put the description in the newly allowed payload section of PKG-INFO (METADATA) files.
- Use distutils instead of sysconfig to get installation paths; can install headers.
Use distutils instead of sysconfig to get installation paths; can install headers.
Improve WheelFile() sort.
Allow bootstrap installs without any pkg_resources.
Your coding agent can read these notes before it upgrades. Set up the MCP server →