如何从PyPi包中提取依赖,而无需下载它



我想远程获取PyPi包的依赖项,而不需要完全下载。

我似乎明白(阅读pip代码),当解决依赖关系时,pip似乎读取鸡蛋一旦包已经下载。

还有别的办法吗?

使用pipdeptree查看安装的 PyPI包的依赖关系。

安装:

pip install pipdeptree

然后运行:

pipdeptree

你会看到这样的内容:

Warning!!! Possible conflicting dependencies found:
* Mako==0.9.1 -> MarkupSafe [required: >=0.9.2, installed: 0.18]
  Jinja2==2.7.2 -> MarkupSafe [installed: 0.18]
------------------------------------------------------------------------
Lookupy==0.1
wsgiref==0.1.2
argparse==1.2.1
psycopg2==2.5.2
Flask-Script==0.6.6
  - Flask [installed: 0.10.1]
    - Werkzeug [required: >=0.7, installed: 0.9.4]
    - Jinja2 [required: >=2.4, installed: 2.7.2]
      - MarkupSafe [installed: 0.18]
    - itsdangerous [required: >=0.21, installed: 0.23]
alembic==0.6.2
  - SQLAlchemy [required: >=0.7.3, installed: 0.9.1]
  - Mako [installed: 0.9.1]
    - MarkupSafe [required: >=0.9.2, installed: 0.18]
ipython==2.0.0
slugify==0.0.1
redis==2.9.1

正如jinghli所指出的,目前还没有一种可靠的方法可以远程获取任意PyPi包的依赖关系,而不需要完全下载它。事实上,依赖关系有时取决于你的环境,所以在一般情况下,像Brian那样执行setup.py代码的方法是需要的。

Python生态系统处理依赖关系的方式在20世纪90年代开始发展,当时这个问题还没有被很好地理解。PEP 508——Python软件包的依赖规范让我们走上了改善这种情况的道路,PEP 426——Python软件包的元数据2.0中的"理想的"草案方法可能会在未来进一步改善它,与PyPI作为仓库的重新实现相结合。

当前的情况在文档Python Dependency Resolution中有很好的描述。

PyPI提供了一个json接口来下载每个包的元数据。info.requires_dist对象包含所需软件包的名称列表,这些软件包具有可选的版本限制等。它经常被忽略,但它是一个开始的地方。

。Django (json)指示:

{ "info": { ... "requires_dist": [ "bcrypt; extra == 'bcrypt'", "argon2-cffi (>=16.1.0); extra == 'argon2'", "pytz" ], ... }

我只是需要找到一种方法来做到这一点,这就是我想到的(从pip偷来的)

def dist_metadata(setup_py):
    '''Get the dist object for setup.py file'''
    with open(setup_py) as f:
        d = f.read()
    try:
        # we have to do this with current globals else
        # imports will fail. secure? not really. A
        # problem? not really if your setup.py sources are 
        # trusted
        exec d in globals(), globals()
    except SystemExit:
        pass
    return distutils.core._setup_distribution

https://stackoverflow.com/a/12505166/3332282回答了为什么执行咒语是微妙的,很难正确。

遗憾的是,pip没有这个功能。PyPI上的包可用的元数据不包括有关依赖项的信息。

通常,您可以从项目网站的README文件中找到详细的依赖项。

pip search可以给出包的一些信息。它可以告诉你它是基于什么。

$ pip search flask
Flask     - A microframework based on Werkzeug, Jinja2 and good intentions

您可以使用如下URL获取JSON格式的PyPI包元数据:https://pypi.org/pypi/<package name>/json .

示例:https://pypi.org/pypi/tensorflow/json

来自OP的评论,这对我来说是正确的答案。

相关内容

  • 没有找到相关文章

最新更新