如何列出 python 轮内的文件?

How do I list the files inside a python wheel?

我正在研究 setup.py 的各种选项以包含非 python 文件,但它们不太直观。我希望能够检查 bdist_wheel 生成的包以查看其中的实际内容——与其说是为了确保它能正常工作(这就是测试的目的),不如说是为了查看我设置的选项。

如何列出 .whl 中包含的文件?

您可以将 wheel 文件的扩展名更改为 .zip,然后像任何其他 zip 文件一样提取内容。

来自 PEP 427

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

例子

Django python package has a wheel file. Try Django-1.8.4-py2.py3-none-any.whl为例。如果您想查看它们最终存储在存档中的位置,它们的包中包含非 python 文件。

代码

以下代码使用 python2python3 可以正常工作。它将列出任何 wheel 包中的文件。我以pep8 wheel包为例,其wheel可以用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)

输出

['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)

因为wheel is a ZIP file, unzip有效。文件名的制表符补全将不起作用,除非将扩展名重命名为 zipfrom zipfile import ZipFile 方法假设系统中仅存在 Python,但 shell 中的一行更实用。


另一种选择是使用 vim 查看 wheel 文件的内容。这可以通过首先将行添加到文件 ~/.vimrc 来完成:

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

vimrc and BufReadCmd 文档)然后使用:

vim filename.whl

vim内,可以按ENTER键输入文件,按:q键退出。 vim 可以在查看 wheel 文件中的目录列表时键入 :q 退出。

正如其他人在答案中指出的那样,任何 .whl 文件都可以使用解压缩或右键单击文件并使用 Ubuntu/Debian 中的 Extract Here 图形界面进行提取系统。

解压后,可以查看.py个文件的源代码和位于library-name-with-version.dist-info目录下的元数据文件的内容。但是,无法检查共享对象 (.so) 文件的源代码,因为它是二进制文件。


另一个方便的选择是使用专门为此目的构建的 wheel-inspect 包。包裹描述如下:

wheel-inspect examines Python wheel files & *.dist-info directories and outputs various information about their contents as JSON-serializable objects.

示例命令是:

$ wheel2json some_lib_wheel_file.whl

那会吐出 json 文件中的内容。如果此 json 文件需要存储在本地,则将输出重定向到 json 文件。

$ wheel2json some_lib_wheel_file.whl > some_lib.json

可以使用 Python 自己的 zipfile module and CLI 列出 wheel(或任何其他 zip 文件):

python -m zipfile --list path/to/my-wheel-file.whl

或提取:

python -m zipfile --extract path/to/my-wheel-file.whl path/to/output/directory