Python 如何从PyPi包中提取依赖项

Python 如何从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,

我的目标很简单,我想远程获得PyPi包的依赖性,而不需要完全下载它

我似乎理解(阅读pip代码)在解析依赖项时,pip似乎在下载包后读取egg


还有别的办法吗

遗憾的是,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