我想在python包中包含某种自我更新机制,我不希望在脚本运行之前调用pip update,因为它非常慢,我正在寻找一种智能机制。
每次使用它都可以进行HTTP调用,可能是PyPi,如果它会检测到新版本,它会在STDERR上输出警告。
显然,作为此过程的一部分,我还想缓存上次调用的结果,因此库不会每天多次检查更新,比如说。
是否有人已经实施了这样的事情?您是否有一个示例可用于在不同的执行之间缓存来自HTTP调用的结果,因此它不会强加显着的延迟?
答案 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
快得多。