我的目标很简单,我想远程获取 PyPi 包的依赖项,而无需完全下载。
我似乎明白(阅读 pip 代码)解决依赖关系时的 pip 似乎在下载包后读取了鸡蛋......
还有其他方法吗?
我的目标很简单,我想远程获取 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
我只需要找到一种方法来做到这一点,这就是我想出的(从 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 的咒语很微妙而且很难正确。
正如 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"
],
...
}
可悲的是, pip 没有这个功能。PyPI 上可用于包的元数据不包括有关依赖项的信息。
通常,您可以从项目网站的 README 文件中找到详细的依赖关系。
pip search
可以提供一些关于包的信息。它可以告诉你它是基于什么的。
$ pip search flask
Flask - A microframework based on Werkzeug, Jinja2 and good intentions