如何找到Python包的依赖项

时间:2015-04-20 15:05:30

标签: python pip

如何以编程方式获取Python包的依赖项列表?

标准setup.py已经记录了这些内容,但是我找不到从 Python或命令行访问的简单方法。

理想情况下,我正在寻找类似的东西:

$ pip install somepackage --only-list-deps
kombu>=3.0.8
billiard>=3.3.0.13
boto>=2.26

或:

>>> import package_deps
>>> package = package_deps.find('somepackage')
>>> print package.dependencies
['kombu>=3.0.8', 'billiard>=3.3.0.13', 'boto>=2.26']

注意,我不是在谈论导入包并查找所有引用的模块。虽然这可能会找到大多数依赖包,但它无法找到所需的最小版本号。那只存储在setup.py。

9 个答案:

答案 0 :(得分:52)

pip show [package name]命令外,还有pipdeptree

只做

$ pip install pipdeptree

然后运行

$ pipdeptree

它将以树形式显示您的依赖关系,例如,

flake8==2.5.0
  - mccabe [required: >=0.2.1,<0.4, installed: 0.3.1]
  - pep8 [required: !=1.6.0,>=1.5.7,!=1.6.1,!=1.6.2, installed: 1.5.7]
  - pyflakes [required: >=0.8.1,<1.1, installed: 1.0.0]
ipdb==0.8
  - ipython [required: >=0.10, installed: 1.1.0]

该项目位于https://github.com/naiquevin/pipdeptree,您还可以在其中找到使用信息。

答案 1 :(得分:39)

尝试在show中使用pip命令,例如:

$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname

更新(检索指定版本的deps):

from pip._vendor import pkg_resources


_package_name = 'somepackage'
_package = pkg_resources.working_set.by_key[_package_name]

print([str(r) for r in _package.requires()])  # retrieve deps from setup.py

Output: ['kombu>=3.0.8', 
         'billiard>=3.3.0.13', 
         'boto>=2.26']

答案 2 :(得分:4)

亚历克斯的答案很好(+1)。在python:

pip._vendor.pkg_resources.working_set.by_key['twisted'].requires()

应该返回类似

的内容
[Requirement.parse('zope.interface>=3.6.0')]

其中twisted是包的名称,您可以在字典中找到它:

pip._vendor.pkg_resources.WorkingSet().entry_keys

列出所有内容:

dict = pip._vendor.pkg_resources.WorkingSet().entry_keys
for key in dict:
    for name in dict[key]:
        req =pip._vendor.pkg_resources.working_set.by_key[name].requires()
        print('pkg {} from {} requires {}'.format(name,
                                                  key,
                                                  req))

应该给你这样的清单:

pkg pyobjc-framework-syncservices from /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC requires [Requirement.parse('pyobjc-core>=2.5.1'), Requirement.parse('pyobjc-framework-Cocoa>=2.5.1'), Requirement.parse('pyobjc-framework-CoreData>=2.5.1')]

答案 3 :(得分:2)

关于在 Windows 机器上找到和测试的方法的简要总结:

  1. 解析PyPI的json文件:https://pypi.org/pypi/<package>/<version>/json(#7)

  2. 检查 /site-packages/<package-version>.dist-info/METADATA(需要预安装)

  3. pip install --no-install <package>:已弃用 (#13)

  4. pip install --download <package>:已弃用 (#11)

  5. pip show <package>#12#1,需要预安装)

  6. 使用 import pippip._vendor.pkg_resources 编写脚本:已弃用 (#2)

  7. 使用 import pkg_resourcessetuptools 包(#6,需要预安装)编写脚本

  8. #4 (https://libraries.io/)

  9. 使用pipdeptree包(#5#3,需要预安装)

  10. 使用 Johnnydep 包 (#8):测试在许多情况下挂起。

  11. conda info [package_name]:已弃用 (#10)

  12. conda search [package_name] --info

  • 请注意,可以列出其他包:vc2015_runtimepython_abilibflang 等。
  • 请注意,此方法可以根据构建和频道列出不同的包。
    例如conda search "Django==3.2" --info -c conda-forge
django 3.2 pyhd3eb1b0_0
-----------------------
file name   : django-3.2-pyhd3eb1b0_0.conda
...
timestamp   : 2021-04-06 20:19:41 UTC
dependencies:
  - asgiref
  - psycopg2
  - python
  - pytz
  - sqlparse

django 3.2 pyhd8ed1ab_0
-----------------------
file name   : django-3.2-pyhd8ed1ab_0.tar.bz2
...
timestamp   : 2021-04-07 21:15:25 UTC
dependencies:
  - asgiref >=3.3.2,<4
  - python >=3.6
  - pytz
  - sqlparse >=0.2.2

还有一点需要注意的是,每种方法都可以提供不同的结果。

例如,requests/setup.py #9 chardetidnaurllib3certifi 是必需的。此外,可能需要额外的包 pyOpenSSLcryptographysocksPySockswin-inet-pton

  • 方法 1 和方法 2 同意。
  • 方法 8 只是列出所有这些(按下探索依赖项按钮就会挂起)。
  • 方法 12 仅列出 chardetidnaurllib3certifi
  • 如果 requests 是在 Linux docker 中使用 pip 安装的,则方法 5 和 7 不会列出任何依赖项。
  • 方法 5、7、9 和 10 列出 chardetidnaurllib3certifi 如果 requests 安装在Windows 机器。

答案 4 :(得分:1)

根据python中的article尝试这个:

import pip 
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages]) 
print(installed_packages_list)

它会显示如下:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']

答案 5 :(得分:1)

以上所有解决方案都是正确的,但效率较低。 如果您使用的是MAC,最好的方法是使用“ pip list”命令。

MacBook-Pro:〜AIMASTER $点列表

希望这对您有帮助...嘘

答案 6 :(得分:1)

这里有很多答案,显示了导入的pip用于程序。 documentation for pip strongly advises against this usage of pip

您实际上可以直接导入pkg_resources并使用相同的逻辑,而不是通过pip导入访问pkg_resources(实际上,这是pip文档中为任何想要链接的人建议的解决方案之一)请参阅以编程方式查看包元信息)。

import pkg_resources

_package_name = 'yourpackagename'

def get_dependencies_with_semver_string():
    package = pkg_resources.working_set.by_key[_package_name]
    return [str(r) for r in package.requires()]

如果您在查找确切的包名时遇到麻烦,则WorkingSet返回的pkg_resources.working_set实例将实现__iter__,因此您可以打印所有包并希望发现它们在里面:)

import pkg_resources

def print_all_in_working_set():
    ws = pkg_resources.working_set
    for package_name in ws:
        print(ws)

这适用于python 2和3(尽管您需要调整python2的打印语句)

答案 7 :(得分:0)

使用https://libraries.io/。在使用pip安装之前,这是探索依赖关系的好地方。

例如。输入google-cloud-storage并搜索,然后您可以找到该库的页面(https://libraries.io/rubygems/google-cloud-storage)。从“发布”中选择要浏览其依赖关系的版本(默认为最新版本),在“依赖关系”下,您可以找到依赖关系列表及其受支持的版本。

答案 8 :(得分:0)

有很好的工具johnnydep。这样做的好处是不必安装要检查的包。

pip install johnnydep

像这样使用:

johnnydep deepspeech-tflite