【问题标题】:shutil.copy2() file size doesn't matchshutil.copy2() 文件大小不匹配
【发布时间】:2021-10-31 17:47:18
【问题描述】:

设置:Synology 与 Docker 运行 Home-Assistant 与 HACS 集成和 pyscript。

我做了以下两个功能:

@service

def getListOfFiles(dirName):
    import os
    # create a list of file and sub directories 
    # names in the given directory
    listOfFile = os.listdir(dirName)
    allFiles = list()
    # Iterate over all the entries
    for entry in listOfFile:
        # Create full path
        fullPath = os.path.join(dirName, entry)
        # If entry is a directory then get the list of files in this directory 
        if os.path.isdir(fullPath):
            allFiles = allFiles + getListOfFiles(fullPath)
        else:
            if fullPath.endswith('jpg'):
                allFiles.append(fullPath)
            elif fullPath.endswith('jpeg'):
                allFiles.append(fullPath)
            elif fullPath.endswith('png'):
                allFiles.append(fullPath)
    return allFiles

@service
def slideshow():
    import random
    import os
    import shutil
    path = '/Slideshow'
    listOfFiles = getListOfFiles(path)
    random_image = random.choice([x for x in listOfFiles])
    image_path = '{}'.format(random_image)
    shutil.copy2(image_path, '/config/www/slide.jpg')

现在一切正常,但目标文件 (slide.jpg) 的大小永远不会正确。它在 10kB - 1000kB 之间变化,而原始图像通常在 7-10 MB 之间。

有什么建议吗?

在 Mac 上运行相同的代码(当然,具有不同的源和目标)效果很好。

使用 .copyfile 和 .copy 的结果相同

【问题讨论】:

  • 会不会在某处发生争用情况,在您检查时输出文件尚未完全写入磁盘?我知道,我正在抓住稻草,但这是一种奇怪的行为,闻起来像同步延迟问题。可以帮助排除故障的额外细节:您如何/何时/在哪里检查结果的大小?在复制和大小检查之间插入(愚蠢的)睡眠会产生影响吗?
  • 我正在检查 Synology File Station,并且复制的图像的分辨率降低了。如果我应该在代码中写入一些内容来帮助解决问题,请告诉我。这是我为 Home Assistant 编写的第一个 python 脚本
  • 有趣的是,如果图像在降低的分辨率下是有效的,这不是损坏的情况。但是,对我来说,什么会降低您显示的代码的分辨率很神秘!
  • 翻了很多遍,我无意中发现,如果 Synology (DSM) 的 Web 界面在后台打开,就会发生这种情况。如果我关闭 Web 界面,则会以正确的大小复制图像。关于为什么,但更重要的是,如何解决这个问题的任何想法?
  • 坦率地说,我不知道。我实际上并不熟悉 Synology,我正在根据您发布的代码分析您的问题。如果我不得不冒险猜测,也许交互式 Web 界面正在检测添加了一个新文件并且有一些规则来处理它?很明显,您显示的代码本身不可能是原因。

标签: python docker synology home-assistant


【解决方案1】:

所以经过大量的挖掘,问题被发现了。 Synology 会为每个带有 S、M、L 缩略图的文件创建一个目录:/@eaDir/,事实证明这是根本原因。这(有时)是正在传输的文件,而不是假定的图像,因此尺寸较小。

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 2021-12-21
    • 1970-01-01
    • 2020-03-21
    • 2015-02-22
    • 2020-02-07
    • 2020-09-19
    • 2021-01-31
    • 1970-01-01
    相关资源
    最近更新 更多