How do I list the files inside a python wheel?

You can take the wheel file change the extension to .zip and then extract the contents like any other zip file.

from PEP 427

A wheel is a ZIP-format archive with a specially formatted file name and the .whl extension.

Example

the Django python package has a wheel file. Try Django-1.8.4-py2.py3-none-any.whl as an example. Their package contains non-python files if you wanted to see where they end up being stored in the archive.

Code

The following code works correctly using python2 and python3. It will list the files in any wheel package. I use the pep8 wheel package as an example, whose wheel can be downloaded with pip download --no-deps pep8==1.7.0.

import pprint
from zipfile import ZipFile

path = 'pep8-1.7.0-py2.py3-none-any.whl'
names = ZipFile(path).namelist()
pprint.pprint(names)

Output

['pep8.py',
 'pep8-1.7.0.dist-info/DESCRIPTION.rst',
 'pep8-1.7.0.dist-info/entry_points.txt',
 'pep8-1.7.0.dist-info/metadata.json',
 'pep8-1.7.0.dist-info/namespace_packages.txt',
 'pep8-1.7.0.dist-info/top_level.txt',
 'pep8-1.7.0.dist-info/WHEEL',
 'pep8-1.7.0.dist-info/METADATA',
 'pep8-1.7.0.dist-info/RECORD']

unzip -l dist/*.whl

(credit)

Since a wheel is a ZIP file, unzip works. Tab completion for the file name won't work, unless the extension is renamed to zip. The from zipfile import ZipFile approach assumes only the presence of Python in the system, but a one-liner in the shell is more practical.


Another option is to view the contents of the wheel file using vim. This can be done by first adding to the file ~/.vimrc the line:

au BufReadCmd *.whl call zip#Browse(expand("<amatch>"))

(vimrc and BufReadCmd documentation) and then using:

vim filename.whl

within vim, files can be entered by pressing the key ENTER, and exited by typing :q. vim can be exited by typing :q when viewing the directory listing within the wheel file.