Release Notes


  • 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
  • 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: '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


  • 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 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
  • Metadata-Version is now 2.1
  • Dropped DESCRIPTION.rst and metadata.json from the list of generated files
  • Dropped support for the non-standard, undocumented provides-extra and requires-dist keywords in setup.cfg metadata
  • Deprecated all wheel signing and signature verification commands
  • Removed the (already defunct) tool extras from


  • Added py-limited-api {cp32|cp33|cp34|…} flag to produce cpNN.abi3.{arch} tags on CPython 3.
  • Documented the license_file metadata key
  • Improved Python, abi tagging for wheel convert. Thanks Ales Erjavec.
  • Fixed > being prepended to lines starting with “From” in the long description
  • Added support for specifying a build number (as per PEP 427). Thanks Ian Cordasco.
  • Made the order of files in generated ZIP files deterministic. Thanks Matthias Bach.
  • Made the order of requirements in metadata deterministic. Thanks Chris Lamb.
  • Fixed wheel install clobbering existing files
  • Improved the error message when trying to verify an unsigned wheel file
  • Removed support for Python 2.6, 3.2 and 3.3.


  • Fix compression type of files in archive (Issue #155, Pull Request #62, thanks Xavier Fernandez)


  • 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, 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)


  • 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 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 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


  • 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
  • Improved test_requires parsing
  • Python 2.6 fixes, “wheel version” command courtesy pombredanne


  • Pregenerated scripts are the default again.
  • “ 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.


  • No longer include console_scripts in wheels. Ordinary scripts (shell files, standalone Python files) are included as usual.
  • Include new command “python -m wheel install-scripts [distribution [distribution …]]” to install the console_scripts (setuptools-style scripts using pkg_resources) for a distribution.


  • pymeta.json becomes pydist.json


  • Python 3 Unicode improvements


  • Support latest PEP-426 “pymeta.json” (json-format metadata)


  • 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


  • 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.
  • Improve WheelFile() sort.
  • Allow bootstrap installs without any pkg_resources.


  • Unit test for wheel.tool.install


  • API cleanup


  • Scripts fixer fix


  • Fix keygen


  • Preserve attributes on install.


  • Include a copy of pkg_resources. Wheel can now install into a virtualenv that does not have distribute (though most packages still require pkg_resources to actually work; wheel install distribute)
  • Define a new setup.cfg section [wheel]. universal=1 will apply the py2.py3-none-any tag for pure python wheels.


  • Only import dirspec when needed. dirspec is only needed to find the configuration for keygen/signing operations.


  • requires-dist from setup.cfg overwrites any requirements from Care must be taken that the requirements are the same in both cases, or just always install from wheel.
  • drop dirspec requirement on win32
  • improved command line utility, adds ‘wheel convert [egg or wininst]’ to convert legacy binary formats to wheel


  • Wheel’s own wheel file can be executed by Python, and can install itself: python wheel-0.9.5-py27-none-any/wheel install ...
  • Use argparse; basic wheel install command should run with only stdlib dependencies.
  • Allow requires_dist in setup.cfg’s [metadata] section. In addition to dependencies in, but will only be interpreted when installing from wheel, not from sdist. Can be qualified with environment markers.


  • Fix wheel.signatures in sdist


  • Integrated digital signatures support without C extensions.
  • Integrated “wheel install” command (single package, no dependency resolution) including compatibility check.
  • Support Python 3.3
  • Use Metadata 1.3 (PEP 426)


  • Automatic signing if WHEEL_TOOL points to the wheel binary
  • Even more Python 3 fixes


  • ‘wheel sign’ uses the keys generated by ‘wheel keygen’ (instead of generating a new key at random each time)
  • Python 2/3 encoding/decoding fixes
  • Run tests on Python 2.6 (without signature verification)


  • Updated digital signatures scheme
  • Python 3 support for digital signatures
  • Always verify RECORD hashes on extract
  • “wheel” command line tool to sign, verify, unpack wheel files


  • none/any draft pep tags update
  • improved wininst2wheel script
  • doc changes and other improvements


  • sort .dist-info at end of wheel archive
  • Windows & Python 3 fixes from Paul Moore
  • pep8
  • scripts to convert wininst & egg to wheel


  • require distribute >= 0.6.28
  • stop using verlib


  • working pretty well


  • hyphenated name fix


  • improve test coverage
  • improve Windows compatibility
  • include tox.ini courtesy of Marc Abramowitz
  • draft hmac sha-256 signing function


  • prototype egg2wheel conversion script


  • Python 3 compatibility


  • Initial version