22

我的目标很简单,我想远程获取 PyPi 包的依赖项,而无需完全下载。

我似乎明白(阅读 pip 代码)解决依赖关系时的 pip 似乎在下载包后读取了鸡蛋......

还有其他方法吗?

4

4 回答 4

13

使用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
于 2017-08-08T07:15:02.540 回答
8

我只需要找到一种方法来做到这一点,这就是我想出的(从 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回答了为什么 exec 的咒语很微妙而且很难正确。

于 2014-02-20T10:43:26.733 回答
8

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

Python 生态系统处理依赖关系的方式在 1990 年代开始发展,当时这个问题还没有被很好地理解。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" ], ... }

于 2017-04-11T15:53:34.857 回答
3

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

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

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

$ pip search flask
Flask     - A microframework based on Werkzeug, Jinja2 and good intentions
于 2013-01-04T11:22:31.633 回答