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": true
或 false
这样的行就好了。如何使用 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')
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": true
或 false
这样的行就好了。如何使用 PyPI JSON API?
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')