如何安全地检查python包是否过时?

时间:2014-11-13 11:19:45

标签: python pypi

我想在python包中包含某种自我更新机制,我不希望在脚本运行之前调用pip update,因为它非常慢,我正在寻找一种智能机制。

每次使用它都可以进行HTTP调用,可能是PyPi,如果它会检测到新版本,它会在STDERR上输出警告。

显然,作为此过程的一部分,我还想缓存上次调用的结果,因此库不会每天多次检查更新,比如说。

是否有人已经实施了这样的事情?您是否有一个示例可用于在不同的执行之间缓存来自HTTP调用的结果,因此它不会强加显着的延迟?

2 个答案:

答案 0 :(得分:9)

要显示过时的软件包,您只需运行pip list -o,但这并不涉及任何缓存。

虽然简单地将pip list -o > outdated.txt添加到cronjob以使其每天自动更新是微不足道的:)

以下是使用pip作为库的示例代码:

def get_outdated():
    import pip

    list_command = pip.commands.list.ListCommand()
    options, args = list_command.parse_args([])
    packages = pip.utils.get_installed_distributions()

    return list_command.get_outdated(packages, options)

print(get_outdated())

答案 1 :(得分:2)

我已经编写了一个库outdated来解决这个问题。使用它的最快方法是在包的根目录中插入这样的代码:

from outdated import warn_if_outdated

warn_if_outdated('my-package-name', '1.2.3')

这将根据请求在stderr上输出警告,将HTTP呼叫缓存24小时等等。详细信息可以在上面的链接中找到。

即使没有缓存,它也比pip list -o快得多。