列出pythonwheel文件的依赖项

列出pythonwheel文件的依赖项,python,python-wheel,Python,Python Wheel,我有Python控制盘文件:psutil-5.4.5-cp26-none-linux\u x86\u 64.whl 如何列出此控制盘的依赖项?您可以在单独的虚拟环境中安装控制盘文件,然后查看安装了哪些其他软件包 使用pipfreeze命令查看所有已安装的软件包。我刚刚尝试解压缩(而不是压缩)一个我放在周围的轮子软件包。packagename version.dist info/METADATA文件包含一系列Requires dist:条目,这些条目包含setup.py中编译的需求,正如前面提到的

我有Python控制盘文件:
psutil-5.4.5-cp26-none-linux\u x86\u 64.whl


如何列出此控制盘的依赖项?

您可以在单独的虚拟环境中安装控制盘文件,然后查看安装了哪些其他软件包


使用
pipfreeze
命令查看所有已安装的软件包。

我刚刚尝试解压缩(而不是压缩)一个我放在周围的轮子软件包。
packagename version.dist info/METADATA
文件包含一系列
Requires dist:
条目,这些条目包含
setup.py
中编译的需求,正如前面提到的,
.whl
文件只是ZIP归档文件。您只需打开它们并在
元数据
文件中浏览即可

然而,有一种工具可以使这个手动过程更容易一些。您可以使用,它可以与pip一起安装

CLI用法:

$ pip install pkginfo
$ pkginfo -f requires_dist psutil-5.4.5-cp27-none-win32.whl
requires_dist: ["enum34; extra == 'enum'"]
API使用:

>>> import pkginfo
>>> wheel_fname = "psutil-5.4.5-cp27-none-win32.whl"
>>> metadata = pkginfo.get_metadata(wheel_fname)
>>> metadata.requires_dist
[u"enum34 ; extra == 'enum'"]

下面是一个不需要任何外部工具(解压、gzip或类似工具)的最小代码段,因此它应该可以在*nix/windows中工作:

wheeldeps.py:

import argparse
from zipfile import ZipFile

parser = argparse.ArgumentParser()
parser.add_argument('filename')
args = parser.parse_args()

archive = ZipFile(args.filename)
for f in archive.namelist():
    if f.endswith("METADATA"):
        for l in archive.open(f).read().decode("utf-8").split("\n"):
            if 'requires-dist' in l.lower():
                print(l)
例如:

> python wheeldeps.py psutil-5.4.5-cp27-cp27m-win_amd64.whl
Requires-Dist: enum34; extra == 'enum'  

这是我在某处找到的一篇文章。我复制了所有内容,并通过电子邮件发送给自己,所以我没有这个答案的来源,但我认为这可能会有所帮助。如果有人知道消息来源,我会删除这篇文章并将其链接到那篇文章

Installation
$ pip install --upgrade pip  # pip-tools needs pip==6.1 or higher (!)
$ pip install pip-tools
Example usage for pip-compile
Suppose you have a Flask project, and want to pin it for production. Write the following line to a file:

# requirements.in
Flask
Now, run pip-compile requirements.in:

$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# Make changes in requirements.in, then run this to update:
#
#    pip-compile requirements.in
#
flask==0.10.1
itsdangerous==0.24        # via flask
jinja2==2.7.3             # via flask
markupsafe==0.23          # via jinja2
werkzeug==0.10.4          # via flask
And it will produce your requirements.txt, with all the Flask dependencies (and all underlying dependencies) pinned. Put this file under version control as well and periodically re-run pip-compile to update the packages.

Example usage for pip-sync
Now that you have a requirements.txt, you can use pip-sync to update your virtual env to reflect exactly what's in there. Note: this will install/upgrade/uninstall everything necessary to match the requirements.txt contents.

$ pip-sync
Uninstalling flake8-2.4.1:
  Successfully uninstalled flake8-2.4.1
Collecting click==4.1
  Downloading click-4.1-py2.py3-none-any.whl (62kB)
    100% |████████████████████████████████| 65kB 1.8MB/s
  Found existing installation: click 4.0
    Uninstalling click-4.0:
      Successfully uninstalled click-4.0
Successfully installed click-4.1

requirement.txt将包含包所需的所有需求

我使用
pipenv
安装我的虚拟环境,根据需要安装
pew
pew
允许您安装在退出这些特殊虚拟环境时删除的临时虚拟环境。所以

创建一个新的空虚拟环境并动态激活它:

pew mktmpenv-p/usr/bin/python3.6

安装您的软件包:

pip安装somedistro

查看发行版的要求(以及要求的要求…):

pip列表

停用并删除临时环境

退出


此外,临时虚拟环境在打包测试中非常有用。

也许您正在寻找类似于?@Begueradj的东西,但您链接的问题不同。我想从控制盘文件中提取依赖项。轮子还没有安装。事实上,我只是试图解压(不是压缩)我放在周围的轮子,在
packagename版本中。dist info/METADATA
文件包含
Requires dist:
条目列表,其中包含
setup.py
@ErikCederstrand中编译的需求,谢谢!如果您将此作为答案编写,那么我将投票表决。您可以尝试此
$pip安装pipdeptree
然后
$pipdeptree-fl
。这是查看递归需求(其他软件包需要的软件包)的唯一方法使用
pip list
命令。但这不能说明是否需要某些版本的软件包。@RolandWeber如果在安装其他软件包的过程中安装了某个软件包,则表示它是必需的。@SHIVAMJINDAL表示该软件包是必需的,但您不知道该软件包的某些版本是必需的还是被排除的。xyz==3.5.7,xyz>3.0,xyz@RolandWeber它会告诉你在安装父包的过程中安装了哪个版本。我放弃了使用
pip工具
,转而使用
pipenv
,它在第一个版本中做得更好(接近npm对Javascript的功能)。