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

PyPI API - How to get stable package version

pip如何判断一个包的稳定版本是哪个版本?比如目前Django的稳定版本是1.7.5(截至2-27-15),也就是通过命令pip install django.

安装的版本

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

"version": "1.8b1",

JSON 响应中有一个键看起来表示稳定:

"stable_version": null,

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

"classifiers": [
    "Development Status :: 4 - Beta", 

但这是一个复杂的解析行。如果有像 "stable_version": truefalse 这样的行就好了。如何使用 PyPI JSON API?

确定默认的 pip 安装版本

PEP-440. There is a module packaging中定义的版本方案,可以处理版本解析和比较。

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

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'))

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

$ python v.py
Django==2.0

只是一个简短的说明(因为我还不能添加对以前答案的回复)sashk 的答案可能 return 一个不正确的答案,因为 max() 并不真正理解版本控制,f.e.截至目前,在 SQLAlchemy 上它认为 1.1.9 高于 1.1.14(这实际上是最新的稳定版本)。

快速解决方案:

import urllib.request
import packaging.version
import distutils.version
data = json.loads(urllib.request.urlopen('https://pypi.python.org/pypi/SQLAlchemy/json').readall().decode('utf-8'))
max([distutils.version.LooseVersion(release) for release in data['releases'] if not packaging.version.parse(release).is_prerelease])

哪个正确 returns

LooseVersion ('1.1.14')