如何以编程方式获取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。
中答案 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)
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 机器上找到和测试的方法的简要总结:
解析PyPI的json文件:https://pypi.org/pypi/<package>/<version>/json
(#7)
检查 /site-packages/<package-version>.dist-info/METADATA
(需要预安装)
pip install --no-install <package>
:已弃用 (#13)
pip install --download <package>
:已弃用 (#11)
使用 import pip
和 pip._vendor.pkg_resources
编写脚本:已弃用 (#2)
使用 import pkg_resources
的 setuptools
包(#6,需要预安装)编写脚本
使用 Johnnydep
包 (#8):测试在许多情况下挂起。
conda info [package_name]
:已弃用 (#10)
conda search [package_name] --info
vc2015_runtime
、python_abi
、libflang
等。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 chardet
、idna
、urllib3
和 certifi
是必需的。此外,可能需要额外的包 pyOpenSSL
、cryptography
、socks
、PySocks
、win-inet-pton
。
chardet
、idna
、urllib3
和 certifi
。requests
是在 Linux docker 中使用 pip
安装的,则方法 5 和 7 不会列出任何依赖项。chardet
、idna
、urllib3
和 certifi
如果 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)