Почему программа python не может подобрать последний файл? - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над POC автоматизации, в которой я должен выполнить следующие шаги в последовательности: 1) создать пакет Debian с помощью инструмента и отправить его в облачное хранилище

2) На моемprod server Я буду выполнять программу на python через задание cron, которое будет следить за местоположением облака, и если будет доступен какой-либо новый файл, он извлечет этот файл оттуда и установит его (debian) на сервер, где находится pythonПрограмма запущена.Однако есть вероятность, что облачное хранилище может не получить новый файл в течение нескольких дней.Таким образом, в этом случае, даже если репозиторий обновлен, скажем, 3 дня назад, но для программы python, которая отслеживает местоположение облака, файл, загруженный в облако, будет самым последним, пока не появится новый файл.Таким образом, в качестве обходного пути я пытаюсь работать над логикой, которая будет продолжать сравнивать временную метку, то есть, если временная метка файла debian не меняется, то предполагается, что программа python завершает работу / проходит или выполняет бизнес-логику.,

Я написал две программы, которые удовлетворяют точке (1) и частично удовлетворяют точке (2).В дальнейшем я сосредоточусь на коде точки (2).Ниже приведен код, который, по моему мнению, должен работать в фоновом режиме для извлечения самого последнего файла, и если временная метка совпадает, то она должна выйти, чтобы протестировать сценарий, я только что выбрал локальные пути моей машины:

import os
import subprocess
import glob
latest_file = 0 # initialized latest_file with zero to compare later
new_path = '/home/amitesh/Desktop'
file_path = glob.iglob('/home/amitesh/Desktop/linux_triad/*.deb')

latest_file = max(file_path, key=os.path.getctime) # Now the latest_file variable has a file in it
time_stamp = os.path.getmtime(latest_file)# gives the timestamp of the latest file

a = 0 # initialized it with zero to compare it with time stamp as follows.
while True:
    if a == time_stamp:
        pass
    else:
        subprocess.Popen(['cp', '-r', latest_file, new_path])
        break

В приведенном выше коде я просто пытаюсь сравнить две переменные 'a' и 'timestamp', т. Е. Если значение a совпадает с time_stamp, то ничего не делать и просто передавать.остальное выполнять бизнес логику.Когда я выполняю код, я вижу, что файл копируется в нужное место, однако, если я проверяю метку времени файла, это, похоже, не самая последняя.ниже приведена группа файлов, доступных в переменной file_path.

baqus_0.1-2_amd64.deb Tue 14 May 2019 01:24:02 PM IST
baqus_0.3-1_amd64.deb Tue 14 May 2019 01:24:04 PM IST
baqus_0.4-1_amd64.deb Tue 14 May 2019 01:24:09 PM IST
leesofd_0.1-1_amd64.deb Tue 14 May 2019 01:24:16 PM IST
syslmd_0.3-2_amd64.deb Tue 14 May 2019 01:24:21 PM IST

Мой код выбрал второй файл из списка, и, кажется, он не имеет самой последней отметки времени, если мы внимательно посмотрим.Последняя отметка времени принадлежит syslmd_0.3-2_amd64.deb, то есть 13:24:21 IST.Итак, снова мой код выбирает baqus_0.3-1_amd64.deb, который имеет отметку времени 01:24:04 IST, которая ниже.Я выполнил это несколько раз, чтобы убедиться, что мои наблюдения верны, и так оно и есть.каждый раз один и тот же файл копируется в целевое местоположение.

Итак, либо моя логика неверна, либо я использую неправильные функции.Пожалуйста, предложите.

Измененный код внутри цикла while

if a == time_stamp:
    pass
else:
    print('copying of the ', latest_file, 'started')
    sleep(4)
    subprocess.Popen(['cp', '-r', latest_file, new_path])
    sleep(3)
    os.system('sudo dpkg --install ' +latest_file)
    a = time_stamp

1 Ответ

1 голос
/ 16 мая 2019

Я не уверен, что полностью понимаю причину необходимости такого обходного пути, но одна вещь бросается в глаза:

Вы сортируете файлы с помощью key=os.path.getctime.В некоторых системах (например, Unix) после docs , то есть

"- время последнего изменения метаданных, а в других (например, Windows) - время созданиядля пути ".

В качестве метки времени из результата сортировки вы сохраняете os.path.getmtime(latest_file), что в соответствии с документами

" Возвратвремя последнего изменения пути. "

Согласно этому вопросу , эти две отметки времени не обязательно совпадают.Таким образом, ctime также может зависеть от времени, файла, который был скопирован, и это зависит от того, как вы нажимаете файлы на шаге 1).Напротив, mtime относится к содержимому файла.

Поэтому попробуйте использовать getmtime в обоих выражениях.Если это не сработает, в крайнем случае, вы можете также назвать ваши файлы как 20190516_095200_sth.deb и отсортировать по имени файла.

...