How to find a Python package's dependencies
如何以编程方式获取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中。
除
只要做
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,在这里您还可以找到使用信息。
尝试在
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'] |