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",
JSON响应中有一个键似乎表示稳定:
"stable_version": null,
但我在API中尝试的所有软件包的值都是null
。 JSON响应中有这一行:
"classifiers": [
"Development Status :: 4 - Beta",
但这是一个要解析的复杂行。如果有像"stable_version": true
或false
这样的行,那就太好了。如何使用PyPI JSON API确定默认的pip安装版本?
答案 0 :(得分:6)
PEP-440中定义的版本方案。有一个模块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
答案 1 :(得分:1)
只是一个简短的注释(因为我无法添加对先前答案的回复),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')