关于pip:如何查找python包的依赖项

How to find a Python package's dependencies

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

标准的setup.py有文档记录,但是我找不到一种从python或命令行访问它的简单方法。

理想情况下,我要找的是:

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

或:

1
2
3
4
>>> 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中。


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

只要做

1
$ pip install pipdeptree

然后运行

1
$ pipdeptree

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

1
2
3
4
5
6
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/pippeptree,在这里您还可以找到使用信息。


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

1
2
3
4
5
6
$ pip show tornado
---
Name: tornado
Version: 4.1
Location: *****
Requires: certifi, backports.ssl-match-hostname

更新(使用指定版本检索DEP):

1
2
3
4
5
6
7
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
1
2
3
Output: ['kombu>=3.0.8',
         'billiard>=3.3.0.13',
         'boto>=2.26']


亚历克斯的回答很好(+1)。在Python中:

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

应该返回类似

1
[Requirement.parse('zope.interface>=3.6.0')]

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

1
pip._vendor.pkg_resources.WorkingSet().entry_keys

全部列出:

1
2
3
4
5
6
7
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))

应该给您这样的列表:

1
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')]

上述所有解决方案都是正确的,但有些效率低下。如果您使用的是Mac,最好的方法是使用"pip list"命令。

MacBook Pro:~aimaster$pip列表

希望这有帮助…布雅


根据本文在python中的说明尝试:

1
2
3
4
5
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)

它将显示如下:

1
2
3
4
5
['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']