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

Python PyPI API-如何获得稳定的软件包版本,python,pip,pypi,Python,Pip,Pypi,pip如何确定哪个版本是软件包的稳定版本?例如,Django当前的稳定版本是1.7.5(从2015年2月27日起),这是通过命令pip install Django安装的版本 但是,当我转到Django()的PypiJSONAPI时,它会解析为最新版本(包括开发版本): JSON响应中有一个键,似乎表示稳定: "stable_version": null, 但是在我在API中尝试的所有包上,该值都是null。JSON响应中有一行: "classifiers": [ "Developme

pip
如何确定哪个版本是软件包的稳定版本?例如,Django当前的稳定版本是
1.7.5
(从2015年2月27日起),这是通过命令
pip install Django
安装的版本

但是,当我转到Django()的PypiJSONAPI时,它会解析为最新版本(包括开发版本):

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

"stable_version": null,
但是在我在API中尝试的所有包上,该值都是
null
。JSON响应中有一行:

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

但这是一个复杂的分析过程。如果有一行像
“stable\u version”:true
false
,那就太好了。如何使用PyPI JSON API确定默认的pip安装版本?

中定义的版本方案。有一个模块,可以处理版本解析和比较

我使用此函数来获取最新的稳定版本的软件包:

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的答案可能会返回错误的答案,因为max()并不真正理解版本控制,例如,到目前为止,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])
哪个正确返回

LooseVersion ('1.1.14')

我建议提高第一段的清晰度;a=解析('1.1.14');b=解析('1.1.9');max(a,b)``按预期工作。也许,他们没有使用PEP-440格式的版本。我通过修改这一行来实现这一点,如下所示
j=json.loads(req.text.encode(req.encoding或“utf-8”)
因为req.encoding有时可能是空的。
LooseVersion ('1.1.14')