我已经确认genfromtxt函数(以及从它派生的函数)以静默方式将它们正在处理的远程文件缓存在本地目录中,并在后续调用中使用本地副本,而无需检查它是否已更改。
通过查看源文件npyio.py,似乎发生了这种情况,因为在不传递相关参数的情况下创建了处理请求的DataSource对象。
当然,修改库源以禁用缓存很容易,但是随后每次升级后我都必须重复一遍。
还有其他解决方案吗? (除了每次删除缓存目录之外)

最佳答案

我认为这个问题实际上由两部分组成:

  • 如果库的功能与所需的行为不完全匹配该怎么办?
  • 如何特别处理genfromtxt的缓存行为?

  • 关于1.,包装(可能是通过注入(inject))比修补库更具弹性(除非修补是在库的仓库中在上游完成)。

    所以包装genfromtxt可以像这样完成:
    def patched_gen_from_text(*args, **kwargs):
        # Do something regarding caching
        return numpy.genfromtxt(*args, **kwargs)
    

    您甚至可以在不修改源代码的情况下将其作为numpy.genfromtext注入(inject)(不是我建议这样做):
    import numpy
    
    numpy.genfromtxt = patched_gen_from_text
    

    关于2.它实际上取决于您对远程文件系统的访问权限(例如,您可以在其中运行过程吗?是否可以挂载它?),以及所需的速度和确定性之间的权衡。

    例如,在一种极端情况下,您的修补版本可能无条件擦除本地文件(某些但速度很慢)。或者,您也许可以请求远程文件的更新时间和长度,并查看它们与本地文件的对应关系。在另一个极端,您可能能够在另一台计算机上的RPC上运行md5检查。

    您可能需要检查filecmp的不同比较选项,以及某些情况下可能的实际构造块。

    10-04 14:02