Python 如何从PyPi包中提取依赖项
我的目标很简单,我想远程获得PyPi包的依赖性,而不需要完全下载它 我似乎理解(阅读pip代码)在解析依赖项时,pip似乎在下载包后读取eggPython 如何从PyPi包中提取依赖项,python,pip,pypi,package-management,Python,Pip,Pypi,Package Management,我的目标很简单,我想远程获得PyPi包的依赖性,而不需要完全下载它 我似乎理解(阅读pip代码)在解析依赖项时,pip似乎在下载包后读取egg 还有别的办法吗 遗憾的是,pip没有这个功能。PyPI上的包可用的元数据不包含有关依赖项的信息 通常,您可以从项目网站的自述文件中找到详细的依赖关系 pip-search可以提供有关软件包的一些信息。它可以告诉你它基于什么 $ pip search flask Flask - A microframework based on Werkzeug,
还有别的办法吗 遗憾的是,pip没有这个功能。PyPI上的包可用的元数据不包含有关依赖项的信息 通常,您可以从项目网站的自述文件中找到详细的依赖关系
pip-search
可以提供有关软件包的一些信息。它可以告诉你它基于什么
$ pip search flask
Flask - A microframework based on Werkzeug, Jinja2 and good intentions
我只是需要找到一种方法来做到这一点,这就是我想出的(从皮普那里偷来的)
解答了为什么exec咒语很微妙,很难正确理解。正如jinghli所指出的,目前没有一种可靠的方法可以远程获取任意PyPi包的依赖性,而无需完全下载它。事实上,依赖关系有时取决于您的环境,因此在一般情况下,需要像Brian那样执行setup.py代码的方法 Python生态系统处理依赖关系的方式在20世纪90年代开始发展,直到人们对这个问题有了很好的理解。使我们走上了改善现状的道路,并于5月提出了一个“理想”的草案方法,与PyPI as的重新实施相结合,在未来对其进行更多的改进 目前的情况在文件中描述得很好 PyPI确实为每个包提供了下载元数据的方法。
info.requires\u dist
对象包含具有可选版本限制等的所需软件包的名称列表。它通常会丢失,但它是一个开始位置
例如,表示:
{
“信息”:{
...
“需要\u dist”:[
“bcrypt;extra=='bcrypt'”,
“argon2 cffi(>=16.1.0);额外=='argon2'”,
“皮茨”
],
...
}
用于查看已安装的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
它要么在
requirements.txt
中,要么在setup.py
中,也许你可以从repo下载一个文件,具体取决于它的托管位置?(即github而不是PyPi)为什么不可以,但如果我不想手动完成“任何”操作,那么这需要针对每个包包,这不会这么容易…您可以在https://pypi.org/pypi//json
,例如,感谢您提供的信息。我真的很惊讶!基于Debian/Ubuntu软件包管理的工作原理,我假设这将是以标准方式从软件包中获取的基本数据,因此e可以显示完整的依赖关系树。虽然我敢说它很复杂…谢谢-很棘手!但是请注意,您需要在顶部显示import distutils
,调用者需要查看dist\u元数据(setup\py).install_需要
,它返回一个包名列表。这就留下了一个问题,即如何获取setup.py
,而不按照OP的要求下载整个包。这与Python3不一样。您需要将globals(),globals()中的exec d更改为exec(d,globals())
和to get requirements查看dist\u元数据(setup\u py)。get\u requires()
方法。pypi链接的JSON不再显示requires\u dist
块:(谢谢@AshBerlin。我更改了示例,因为jupyter不再有requires\u dist
适合我的使用
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