размер файла shutil.copy2() не совпадает

#python #docker #synology #home-assistant

Вопрос:

Настройка: Synology с докером, работающим на дому-Помощник с интеграцией 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) никогда не бывает правильного размера. Он варьируется от 10 КБ до 1000 КБ, в то время как исходное изображение часто составляет 7-10 МБ.

Есть какие-нибудь предложения?

Запуск одного и того же кода (с разным источником и назначением, конечно) на Mac работает идеально.

Те же результаты при использовании .copyfile и .copy

Комментарии:

1. Может ли где-то происходить состояние гонки, когда выходной файл не полностью записан на диск к моменту его проверки? Я знаю, что хватаюсь за соломинку, но это странное поведение, которое пахнет проблемой задержки синхронизации. Дополнительные сведения, которые могут помочь в устранении неполадок: как/когда/где вы проверяете размер результатов? Имеет ли значение (глупый) сон, вставленный между копией и проверкой размера?

2. Я проверяю файловую станцию Synology, и скопированное изображение имеет уменьшенное разрешение. Если я должен что-то написать в коде, чтобы помочь в устранении неполадок, дайте мне знать. Это первый скрипт на python, который я написал для домашнего помощника

3. Интересно, что если изображение действительно с уменьшенным разрешением, это не случай коррупции. Однако для меня загадочно, что может уменьшить разрешение в коде, который вы показываете, однако!

4. Поэтому, много копаясь, я случайно обнаружил, что если веб-интерфейс для Synology (DSM) открыт в фоновом режиме, происходит такая ситуация. Если я закрою веб-интерфейс, изображение будет скопировано в правильном размере. Есть идеи по поводу того, почему, но что более важно, как это исправить?

5. Честно говоря, я понятия не имею. Я на самом деле не знаком с Synology, я анализирую ваш вопрос на основе кода, который вы опубликовали. Если мне придется рискнуть предположить, может быть, интерактивный веб-интерфейс обнаруживает, что был добавлен новый файл, и у него есть некоторые правила для его обработки? Что ясно, так это то, что код, который вы показываете, сам по себе не может быть причиной.

Ответ №1:

Итак, после долгих поисков проблема была найдена. Synology создает каталог: /@eaDir/ для каждого файла с миниатюрой в S, M, L, которая оказалась основной причиной. Это (иногда) был передаваемый файл, а не предполагаемое изображение, следовательно, меньший размер.