【问题标题】:Strange behavior of urlopen from urllib.request in python3python3中urllib.request中urlopen的奇怪行为
【发布时间】:2020-10-09 23:40:06
【问题描述】:

我正在编写应用程序,您可以找到here

它具有我用来获取更新日志列表的功能:

def getChangeLog():
    """
    This function downloads changelog from our repository.
    :return:
    list of change strings
    """
    return [change.decode().rstrip() for change in urlopen(
        'https://raw.githubusercontent.com/Acmpo6ou/PyQtAccounts/master/change.log')]

然后我可以使用此列表显示添加到我的应用程序的更改,在进行更改并将它们提交到存储库后我需要做的就是更新change.log 文件,因此当用户打开我的应用程序时,对话框将被显示,它将包含更改日志。

但由于某些奇怪的原因,urlopen 总是下载旧的 change.log 文件。

假设我的 change.log 中有这个:

Some fixes.
Something is added.

然后假设我做了一些更改,例如更改了序列化标准。所以我将我的 change.log 更新为:

Changed serialization standard.

当用户打开我的应用程序时,getChangeLog 函数将获取 change.log 文件,然后它会向用户显示包含此更改日志的对话框,因此用户将看到如下内容:

Changelog for v2.3.6:
* Changed serialization standard.

但由于某些奇怪的原因,这就是将要显示的内容:

Changelog for v2.3.6:
* Some fixes.
* Something is added.

它显示旧的change.log 我在python控制台中尝试了我的getChangeLog函数,它确实返回了旧的change.log,我什至尝试使用urlopen自己获取change.log文件,它仍然获得旧的。 最有趣的是,如果我调用 getChangeLog 几次,它就会开始返回新的 change.log

我很困惑,谁能解释我如何解决这个问题?

【问题讨论】:

    标签: python-3.x urlopen


    【解决方案1】:

    可能的原因是我总是在启动时调用我的getChangeLog 函数,它会下载更新日志。由于我经常测试我的应用程序 - 我经常启动它,getChangeLog 被调用了很多,我们下载了很多更新日志。

    所以操作系统认为:如果我们经常下载更新日志(实际上它很少更改),那么我们为什么不执行一些缓存呢?而不是实际下载更新日志,操作系统提供了它的缓存版本。

    然后,当更改日志实际更改时,操作系统仍然提供其缓存版本,如果我调用我的 getChangeLog 函数几次缓存过期并显示新的更改日志!

    我认为这是问题所在,因为当我尝试在我不经常使用的另一台机器上进行更新时,因此我不经常启动我的应用程序时,我看到了新的更新日志。

    谜团解开了。

    【讨论】:

      猜你喜欢
      • 2017-12-07
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多