[英]Python package dependency tree
我想分析一下Python包的依赖树。 我怎样才能获得这些数据?
我已经知道的事情
setup.py
有时包含一个列出包依赖项的requires
字段我不知道的事情
requires
字段中明确列出依赖项,但pip/easy_install
仍然设法下载正确的包。 我错过了什么? 例如,流行的统计计算库pandas
没有列出requires
但仍然设法安装numpy
、 pytz
等......有没有更好的方法来自动收集完整的依赖项列表?你应该寻找在install_requires
场相反,看到新增和更改setup
的关键字。
requires
被认为是一个过于模糊的字段,无法依赖于依赖项安装。 此外, setup.py
和运行测试所需的依赖项还有setup_requires
和test_requires
字段。
当然,依赖图之前已经分析过了; 从Olivier Girardot 的这篇博客文章中可以看到这张奇妙的图片:
以下是使用 python pip
包以编程方式执行此操作的方法:
from pip._vendor import pkg_resources # Ensure pip conf index-url pointed to real PyPi Index
# Get dependencies from pip
package_name = 'Django'
try:
package_resources = pkg_resources.working_set.by_key[package_name.lower()] # Throws KeyError if not found
dependencies = package_resources._dep_map.keys() + ([str(r) for r in package_resources.requires()])
dependencies = list(set(dependencies))
except KeyError:
dependencies = []
以下是如何从 PyPi API 获取依赖项:
import requests
import json
package_name = 'Django'
# Package info url
PYPI_API_URL = 'https://pypi.python.org/pypi/{package_name}/json'
package_details_url = PYPI_API_URL.format(package_name=package_name)
response = requests.get(package_details_url)
data = json.loads(response.content)
if response.status_code == 200:
dependencies = data['info'].get('requires_dist')
dependencies2 = data['info'].get('requires')
dependencies3 = data['info'].get('setup_requires')
dependencies4 = data['info'].get('test_requires')
dependencies5 = data['info'].get('install_requires')
if dependencies2:
dependencies.extend(dependencies2)
if dependencies3:
dependencies.extend(dependencies3)
if dependencies4:
dependencies.extend(dependencies4)
if dependencies5:
dependencies.extend(dependencies5)
dependencies = list(set(dependencies))
您可以使用递归调用依赖项的依赖项来获取完整树。 干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.