PyPI API - 如何获得稳定的包版本

aus*_*man 5 python pip pypi

如何pip确定哪个版本是包的稳定版本?例如,当前Django的稳定版本是1.7.5(截至2-27-15),这是该命令安装的版本pip install django.

但是当我使用Django的PyPI JSON API(https://pypi.python.org/pypi/Django/json)时,它会解析为最新版本(包括开发版本):

"version": "1.8b1",
Run Code Online (Sandbox Code Playgroud)

JSON响应中有一个键似乎表示稳定:

"stable_version": null,
Run Code Online (Sandbox Code Playgroud)

但是值null在我在API中尝试的所有包中.JSON响应中有这一行:

"classifiers": [
    "Development Status :: 4 - Beta", 
Run Code Online (Sandbox Code Playgroud)

但这是一个需要解析的复杂问题.如果有像"stable_version": true或那样的线路会很好 false.如何使用PyPI JSON API确定默认的pip安装版本?

sas*_*shk 7

PEP-440中定义的版本方案.有一个模块打包,可以处理版本解析和比较.

我想出了这个函数来获得最新的稳定版本的软件包:

import requests
import json
try:
    from packaging.version import parse
except ImportError:
    from pip._vendor.packaging.version import parse


URL_PATTERN = 'https://pypi.python.org/pypi/{package}/json'


def get_version(package, url_pattern=URL_PATTERN):
    """Return version of package on pypi.python.org using json."""
    req = requests.get(url_pattern.format(package=package))
    version = parse('0')
    if req.status_code == requests.codes.ok:
        j = json.loads(req.text.encode(req.encoding))
        releases = j.get('releases', [])
        for release in releases:
            ver = parse(release)
            if not ver.is_prerelease:
                version = max(version, ver)
    return version


if __name__ == '__main__':
    print("Django==%s" % get_version('Django'))
Run Code Online (Sandbox Code Playgroud)

执行时,会产生以下结果:

$ python v.py
Django==2.0
Run Code Online (Sandbox Code Playgroud)

  • 我通过如下修改此行来实现此目的 ```j = json.loads(req.text.encode(req.encoding or "utf-8"))``` 因为 req.encoding 有时可能为空。 (2认同)