Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python包依赖关系树_Python_Dependency Management_Pypi - Fatal编程技术网

Python包依赖关系树

Python包依赖关系树,python,dependency-management,pypi,Python,Dependency Management,Pypi,我想分析Python包的依赖关系树。我如何获得这些数据 我已经知道的事情 setup.py有时包含一个requires字段,该字段列出了包依赖项 PyPi是Python包的在线存储库 PyPi有一个API 我不知道的事情 PyPi上很少有项目(约10%)在requires字段中明确列出依赖项,但pip/easy\u install仍然能够下载正确的软件包。我错过了什么?例如,用于统计计算的流行库,pandas,没有列出要求,但仍然能够安装numpy,pytz,等等。。。。是否有更好的方法自动收集

我想分析Python包的依赖关系树。我如何获得这些数据

我已经知道的事情

  • setup.py
    有时包含一个
    requires
    字段,该字段列出了包依赖项
  • PyPi是Python包的在线存储库
  • PyPi有一个API
  • 我不知道的事情

  • PyPi上很少有项目(约10%)在
    requires
    字段中明确列出依赖项,但
    pip/easy\u install
    仍然能够下载正确的软件包。我错过了什么?例如,用于统计计算的流行库,
    pandas
    ,没有列出
    要求
    ,但仍然能够安装
    numpy
    pytz
    ,等等。。。。是否有更好的方法自动收集依赖项的完整列表
  • 是否有一个预先存在的数据库?我在重复现有的工作吗
  • 其他语言是否有类似的、易于访问的数据库和分发系统(R、Clojure等…?)

  • 您应该查看
    install\u requires
    字段,请参阅

    要求
    被认为是一个过于模糊的字段,依赖项安装无法依赖。此外,对于
    setup.py
    和运行测试所需的依赖项,还有
    setup\u requires
    test\u requires
    字段

    当然,之前已经分析过依赖关系图;由此产生了一幅奇妙的画面:


    图像链接到图形的交互式版本。

    使用类似工具,您可以列出每个包的所有要求

    命令是:

    pip install --no-install package_name
    

    您可以在脚本中重用部分pip。负责解析需求的部分是模块

    以下是如何使用python
    pip
    package以编程方式完成此任务:

    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))
    

    您可以使用递归调用依赖项的依赖项来获得完整的树。干杯

    就目前而言,你的问题实际上太宽泛了。不要在一篇文章中提出太多的问题,要保持它的实用性和可回答性。你的第三点。引起争论和购物清单,而不是具体的答案。我喜欢在Python中使用
    pip
    。如果已安装软件包,则命令行界面将失败。如何直接使用Python代码来查找特定软件包的依赖项?
    --不推荐使用任何安装。这是一个非常漂亮的图形!这张图令人难以置信。尽管这张图很漂亮,但我不知道如何阅读它。我在json api中也可以看到
    requires\u dist
    :有一些像加密术这样的包使用“install\u requires”,而这些信息在api中是不存在的: