How do I list the files inside a python wheel?
Solution 1:
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']
Solution 2:
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.
Solution 3:
One could use Python's own zipfile
module and CLI to list the files in a wheel (or any other zip file):
python -m zipfile --list path/to/my-wheel-file.whl
Or to extract:
python -m zipfile --extract path/to/my-wheel-file.whl path/to/output/directory
Solution 4:
As others have pointed out in the answers, any .whl
file can be extracted using unzip or by right clicking on the file and extracting using the Extract Here
graphical interface in Ubuntu/Debian systems.
After extracting, one can inspect the source code of .py
files and the contents of metadata files which will be located in library-name-with-version.dist-info
directory. However, the source code of shared object (.so
) files can not be inspected since that's a binary file.
Another handy option would be to use the wheel-inspect package which is specifically built for this purpose. The description of the package is stated as:
wheel-inspect
examines Python wheel files &*.dist-info
directories and outputs various information about their contents as JSON-serializable objects.
A sample command is:
$ wheel2json some_lib_wheel_file.whl
That would spit out the contents in a json file. If this json file needs to be stored locally, then redirect the output to a json file.
$ wheel2json some_lib_wheel_file.whl > some_lib.json