跳转到主要内容

自动更新Python发布信息

项目描述

https://sourceforge.net/p/release-info/code/ci/default/tree/_doc/_static/license.svg?format=raw https://sourceforge.net/p/release-info/code/ci/default/tree/_doc/_static/pypi.svg?format=raw https://sourceforge.net/p/oitnb/code/ci/default/tree/_doc/_static/oitnb.svg?format=raw https://sourceforge.net/p/ryd/code/ci/default/tree/_doc/_static/ryd.svg?format=raw

由于各种原因,您可能想知道哪些Python版本是“当前”的

  • 为tox提供pyXY目标的列表

  • 从您生成并上传到PyPI的.whl文件中删除不再支持的Python版本

  • 确定要包含在包信息中的哪个‘编程语言 :: Python ::’分类器

  • 检查您是否在所有服务器上安装了Python的最新微版本

从各种PEP(通常格式略有不同)、python.org和其他网页中提取此类信息很繁琐。此软件包提供了一种名为python_release_info的命令行实用工具,您可以在脚本、makefile等中使用它,并提供了一个程序接口来获取发布信息。

发布信息从互联网检索,可以每天更新(无需更新软件包本身)。基于Python的构建脚本可以检查是否有新版本可供下载,并根据需要进行操作。还可以查询预发布信息。

以下是从2020年3月28日的一个命令行会话(您可以通过指定--dd 2020-03-28来模拟)

$ /opt/python/3.8.2/bin/python -m venv --copies /opt/util/pri
$ source /opt/util/pri/bin/activate
(pri) $ pip install -U -q pip
(pri) $ pip install -q release_info
(pri) $ python_release_info current
2.7.17
3.5.9
3.6.10
3.7.7
3.8.2
(pri) $ python_release_info pre
3.9.0.a.5
(pri) $ echo $?    # 0 -> updated, 1 -> not updated
1
(pri) $ mkdir -p /opt/util/pri/tmp
(pri) $ python_release_info --dir /opt/util/pri/tmp update --extract
(pri) $ ls --classify /opt/util/pri/tmp
Python-3.8.2/  Python-3.8.2.tar.xz

如果提供md5信息(对于所有当前和未来的版本都是真实的),则检查下载的tar文件。

脚本允许使用“一站式”(更新、下载、提取构建)操作

python_release_info update --dir /data/DOWNLOAD/cpython --extract --build='make -f ../Makefile'

该脚本可以定期运行,例如通过crontab。它会检查是否有新版本,如果有,则将.tar.xz文件下载到/data/DOWNLOAD/cpython,并检查下载文件的md5校验和。然后,它切换到该目录,并解压tar文件。之后,它切换到解压创建的顶级目录,设置环境变量PYTHONVERSION为提取的版本,并执行--build选项的参数。

如果这个一站式解决方案不能满足您的需求,您可以简单地编写一个适合您环境的命令行或Python程序。

配置文件

您的配置文件通常是~/.config/python_release_info/config.ini(即遵循XDG),除非是Windows:%APPDATA%/python_release_info/config.ini

该文件的[INFO]部分允许您添加或覆盖自动更新信息中的数据

[INFO]
add = xxx.pon
overwrite = yyy.pon

您可以设置这些条目,也可以不设置。默认情况下,这两个条目都被注释掉了。文件必须与release_info.pon的层次结构相同,因此最好复制该文件,删除不相关的部分,然后更新其余部分。

两者的区别在于,当使用add时,从那里加载的数据不会覆盖从release_info.pon加载的已有“路径”到叶节点数据。您应该为预期将包含在未来的自动更新中的信息使用add,并且在它被包含时,您希望使用该信息。例如,当您发现数据中存在错误,并且无法等待它在release_info存储库中修复并自动下载时,您应该使用overwrite

因此,如果自动更新的release_info.pon(实际上有更多数据)中包含以下内容

dict(
  cpython={
    (3, 8): {
      (3, 8, 0): dict(rel=date(2019, 10, 14)),
      (3, 8, 1): dict(rel=date(2019, 12, 18)),
      (3, 8, 2): dict(rel=date(2020, 2, 24), md5='e9d6ebc92183a177b8e8a58cad5b8d67'),
    },
  }
)

并且您的xxx.pon文件(将要添加)包含以下内容

dict(
  cpython={
    (3, 8): {
      (3, 8, 0): dict(md5='dbac8df9d8b9edc678d0f4cacdb7dbb0'),
      (3, 8, 1): dict(rel=date(2019, 12, 25), md5='b3fb85fd479c0bf950c626ef80cacb57'),
      (3, 8, 3): dict(rel=date(2020, 5, 4)),
    },
  }
)

那么结果将是

dict(
  cpython={
    (3, 8): {
      (3, 8, 0): dict(rel=date(2019, 10, 14), md5='dbac8df9d8b9edc678d0f4cacdb7dbb0'),
      (3, 8, 1): dict(rel=date(2019, 12, 18), md5='b3fb85fd479c0bf950c626ef80cacb57'),
      (3, 8, 2): dict(rel=date(2020, 2, 24), md5='e9d6ebc92183a177b8e8a58cad5b8d67'),
      (3, 8, 3): dict(rel=date(2020, 5, 4)),
    },
  }
)

但是,如果相同的内容在yyy.pon(将要覆盖)中,那么结果将是

dict(
  cpython={
    (3, 8): {
      (3, 8, 0): dict(rel=date(2019, 10, 14), md5='dbac8df9d8b9edc678d0f4cacdb7dbb0'),
      (3, 8, 1): dict(rel=date(2019, 12, 25), md5='b3fb85fd479c0bf950c626ef80cacb57'),
      (3, 8, 2): dict(rel=date(2020, 2, 24), md5='e9d6ebc92183a177b8e8a58cad5b8d67'),
      (3, 8, 3): dict(rel=date(2020, 5, 4)),
    },
  }
)

区别在于3.8.1版本发布的日期。

设置默认值

您可以在配置文件的DEFAULTS部分设置全局--dir选项的默认值

[DEFAULTS]
dir = /opt/util/pri/tmp

这也适用于子解析器,例如,您可以始终强制下载

[DEFAULTS.DOWNLOAD]
force = True
  • 配置文件中的部分名称将被转换为小写,因此您也可以使用[defaults.download][Defaults.Download]

  • 键/值条目不会被转换,您的键必须与选项(减去--)完全匹配,才能从配置文件设置默认值。

  • 命令行上提供的选项覆盖配置文件中的选项(如果配置文件中设置了强制,则目前无法从命令行取消强制)

API

您可以使用程序中的发布信息

import pathlib
from release_info import release_info

def download_and_extract_latest_micro_versions_non_end_of_life():
    ri = release_info()
    ri.download_data()
    latest = None
    for version in ri.find_current():
        url = ri.src_url(version)
        print(version, url)  # list the versions found
        latest = version
    # extract the last of the versions found
    path = pathlib.Path('/var/tmp')
    ri.download(latest, dir=path, extract=True)
    print(list(path.glob('Python*')))

def download_and_extract_new_versions_only():
    ri = release_info()
    for version in ri.download_data():
        path = pathlib.Path('/var/tmp/new')
        ri.download(latest, dir=path, extract=True)

download_and_extract_latest_micro_versions_non_end_of_life()

显示

(3, 7, 12) https://pythonlang.cn/ftp/python/3.7.12/Python-3.7.12.tar.xz
(3, 8, 12) https://pythonlang.cn/ftp/python/3.8.12/Python-3.8.12.tar.xz
(3, 9, 10) https://pythonlang.cn/ftp/python/3.9.10/Python-3.9.10.tar.xz
(3, 10, 2) https://pythonlang.cn/ftp/python/3.10.2/Python-3.10.2.tar.xz
[PosixPath('/var/tmp/Python-3.10.1'), PosixPath('/var/tmp/Python-3.10.1.tar.xz'), PosixPath('/var/tmp/Python-3.10.2'), PosixPath('/var/tmp/Python-3.10.2.tar.xz')]

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码发行版

release_info-0.3.6.tar.gz (25.4 kB 查看哈希值)

上传时间 源代码

构建发行版

release_info-0.3.6-py3-none-any.whl (16.0 kB 查看哈希值)

上传时间 Python 3

支持