如何从PyPi包中提取依赖项

时间:2013-01-04 09:50:46

标签: python pip pypi package-management

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

我似乎理解(阅读pip代码)在解析依赖关系时pip似乎在包下载后读取了蛋...

还有其他方法吗?

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

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

$ pip search flask
Flask     - A microframework based on Werkzeug, Jinja2 and good intentions

答案 2 :(得分:3)

使用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

答案 3 :(得分:1)

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

Python生态系统处理依赖关系的方式在1990年代开始发展,然后才能充分理解问题。 PEP 508 -- Dependency specification for Python Software Packages为我们提供了改善目标的方法,PEP 426 -- Metadata for Python Software Packages 2.0中的“志向”草案方法可能会在未来更好地改进,同时将PyPI重新实现为Warehouse

目前的情况在文件Python Dependency Resolution中有详细描述。

PyPI确实提供json interface来下载每个包的元数据。 info.requires_dist对象包含所需包的名称列表以及可选的版本限制等。它经常缺失,但它是一个可以开始的地方。

E.g。 Django (json)表示:

{ "info": { ... "requires_dist": [ "bcrypt; extra == 'bcrypt'", "argon2-cffi (>=16.1.0); extra == 'argon2'", "pytz" ], ... }

答案 4 :(得分:0)

一个完美的解决方案是尝试安装软件包,并通过使用新的virtualenvpip freeze来了解它所依赖的具体内容。

例如,让我们找出thefuck的依赖关系列表:

创建一个新的虚拟环境并将其激活:

virtualenv env --python=python3.6
source env/bin/activate

pip freeze显示未安装任何软件包:

(env) pip3 freeze

安装软件包,并且已经看到正在安装的依赖项:

(env) pip3 install thefuck
...
Installing collected packages: wcwidth, pyte, psutil, colorama, decorator, six, thefuck
Successfully installed colorama-0.3.9 decorator-4.1.2 psutil-5.4.2 pyte-0.7.0 six-1.11.0 thefuck-3.25 wcwidth-0.1.7

pip freeze列出已安装的所有内容:

(env) pip3 freeze
colorama==0.3.9
decorator==4.1.2
psutil==5.4.2
pyte==0.7.0
six==1.11.0
thefuck==3.25
wcwidth==0.1.7