67

我正在探索setup.py包括非 python 文件的各种选项,它们有点不直观。我希望能够检查生成的包bdist_wheel以查看其中的实际内容——与其说确保它可以工作(这就是测试的目的),不如说看看我设置的选项的效果.

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

4

4 回答 4

68

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

PEP 427

轮子是具有特殊格式的文件名和.whl扩展名的 ZIP 格式存档。

例子

Django python 包有一个wheel 文件。以 Django-1.8.4- py2.py3 -none-any.whl为例。如果您想查看它们最终存储在存档中的什么位置,它们的包包含非 python 文件。

代码

以下代码使用python2and可以正常工作python3。它将列出任何车轮包中的文件。我以pep8wheel 包为例,可以使用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']
于 2015-10-03T15:59:11.293 回答
36
unzip -l dist/*.whl

信用

由于轮子是ZIP文件,因此unzip可以工作。文件名的制表符完成将不起作用,除非将扩展名重命名为zip. 该from zipfile import ZipFile方法仅假设系统中存在 Python,但 shell 中的单行更实用。


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

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

vimrcBufReadCmd文档),然后使用:

vim filename.whl

其中vim,文件可以按 键进入,ENTER键入退出:q。查看wheel文件中的目录列表时,vim可以通过键入退出。:q

于 2017-10-16T19:16:08.653 回答
11

可以使用 Python 自己的zipfile模块和 CLI列出轮子中的文件(或任何其他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
于 2020-06-05T07:13:59.777 回答
1

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

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


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

wheel-inspect检查 Python 轮文件和*.dist-info目录,并将有关其内容的各种信息输出为JSON 可序列化对象。

一个示例命令是:

$ wheel2json some_lib_wheel_file.whl

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

$ wheel2json some_lib_wheel_file.whl > some_lib.json
于 2020-06-05T02:14:53.773 回答