почему сравнение меток времени в операторе if не работает согласно логике, применяемой в моей программе на python? - PullRequest
0 голосов
/ 17 мая 2019

На моем prod-сервере я буду запускать прогу python через вкладку cron, которая будет следить за местоположением облака, и если будет доступен какой-либо новый файл, он будет извлечен и установлен на сервере, где находится прога pythonБег.Однако есть вероятность, что облачное хранилище может не получить новый файл в течение нескольких дней.Таким образом, в этом случае последний обновленный файл будет оставаться последним файлом для программы python, пока не появится новый файл.Таким образом, один из способов состоит в том, чтобы сравнивать временную метку файла с некоторым флагом в коде, то есть, если временная метка файла Debian не изменяется, тогда программа python сравнивает временную метку файла с флагом и затем завершает работу / проходитили выполнить бизнес-логику.Ниже приведен фрагмент кода, с которым я пытаюсь работать:

import os 
import subprocess 
import glob 

src_path = glob.iglob('path_to/*.deb')
trgt_path = '<Path>' 

try:
    for i in src_path:
        ltst_file = max(i, key=os.path.getmtime)
        time_stamp = os.path.getmtime(ltst_file)
        flag = 0
        while True:
            if flag == time_stamp:
                pass
            else:
                subprocess.Popen(['cp', '-r', ltst_file, trgt_path])
                flag = time_stamp
                break
except (ValueError, Exception, FileNotFoundError) as foo:
    print("Program couldn't bring the file from ab20", foo)

1) Программа в первый раз всегда будет переходить к блоку "else", потому что значение флага и time_stamp будут разными., он должен перейти к блоку «если» во 2-й раз, если исходное местоположение не обновляется с каким-либо новым файлом.Но это никогда не идет в блок «если» в моем случае.

2) Для дальнейшей диагностики я запустил прогу без 'break'.На этот раз он снова пошел в блок 'else' и обновил целевое местоположение тем же файлом, который пришел в исходное местоположение пару дней назад, но для изменения он перешел в блок «if» после выполнения и остается тамнавсегда.Таким образом, в идеале, он удовлетворяет частичному требованию, но не полностью, так как он должен непосредственно перейти к блоку 'if' и выйти / пройти вместо перехода к блоку 'else', чтобы скопировать файл в целевое местоположение в первую очередь как файлв те же дни.Я использовал try и кроме block, чтобы перехватить любую ошибку,

3) С помощью оператора 'break' в программе код просто дает следующее сообщение.

Program couldn't bring the file from ab20 [Errno 2] No such file or directory: 'g'
Process finished with exit code 0

Я не уверенПо какой логике мне не хватает, пожалуйста, предложите.

Ошибка:

Traceback (most recent call last):
  File "x20.py", line 7, in <module>
    ltst_file = max(src_path, key=os.path.getmtime)
ValueError: max() arg is an empty sequence

Добавление ошибки пустого списка:

[]
No files found at all.
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.
[]
No files found at all.

Я могу записаться на дискрасположение в облаке через CLI и может подтвердить наличие 5 файлов debian.

Пара проблем:

1) Наш план состоит в том, чтобы выполнить код с помощью задания cron.Итак, если я правильно понял, то каждый раз, когда выполняется задание cron, значение «latest_timestamp_processed» всегда будет по умолчанию равно None.Таким образом, в случае, если местоположение облака не обновляется даже в течение пары часов, код всегда будет рассматривать уже доступный файл как последний файл и продолжит работать с тем же файлом снова и снова.Пожалуйста, поправьте меня, если я ошибаюсь.Есть ли в любом случае, мы можем решить эту проблему, модифицируя существующий код как-то?или если у вас есть альтернативное предложение, дайте мне знать.

2) Я планирую выполнить код в фоновом режиме и сгенерировать логи с помощью модуля регистрации Python.Я изменил код для использования модуля регистрации, так как журналы требуются.Так что, да, выполнение кода непрерывно в фоновом режиме будет генерировать огромные журналы, которые я, безусловно, могу запустить cron, чтобы удалить их через определенный интервал.Эту часть я просто хотел сообщить вам.

В противном случае ваш код работает так, как вам нужно.

1 Ответ

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

Пока я не могу комментировать - если я правильно понимаю, вам нужен скрипт, который

  • работает бесконечно
  • периодически ищет самые новые файлы в указанном исходном пути
  • если существует новый файл, который моложе, чем последний скопированный файл, скопируйте этот файл один раз, а затем снова дождитесь новых файлов

Верно?Вот предложение, как решить это.Вместо вашей копии, которую я только что использовал print, ее было проще тестировать.Вставьте то, что вам нужно.

import os
import time
import glob

latest_timestamp_processed = None # no one yet

while True:

    source_files = list(glob.iglob('*.deb'))

    if len(source_files) > 0: # only do sth. if there are files

        latest_file = max(source_files, key=os.path.getmtime)
        latest_timestamp = os.path.getmtime(latest_file)

        if (latest_timestamp_processed is None) \
                or (latest_timestamp>latest_timestamp_processed):

                    try:
                        print("Processing latest file '{}'..".format(latest_file))
                        # subprocess.Popen(['cp', '-r', latest_file, target_path])
                        latest_timestamp_processed = latest_timestamp
                    except Exception as exc:
                        print("Errors processing latest file '{}': {}".format(latest_file, exc))
        else:
            print("No newer files found.")
    else:
        print("No files found at all.")

    time.sleep(1) # wait a second (maybe specify more)

Я вставил time.sleep(1), чтобы сохранить мощность процессора.

Чтобы протестировать скрипт, вы можете запустить его в одном терминале,затем откройте второй терминал и создайте новые (пустые) файлы, используя

touch test.deb

или, если вы хотите использовать конкретную дату для имитации слишком старых файлов

touch test.deb -d "2019-01-03"

Удачи.

...