我想远程获取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的评论,这对我来说是正确的答案。