Время расписания перезаписывается модулем Schedule при вызове через массив в Python - PullRequest
0 голосов
/ 21 октября 2019

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

Пример того, как вы обычно планировали бы несколько раз на один день:

schedule.every().sunday.at('17:25').do(job)
schedule.every().sunday.at('17:30').do(job)
schedule.every().sunday.at('17:35').do(job)

Это прекрасно работает, но я действительно хочу загрузить время с циклом for, чтобы у меня не было гигантского оператора if, и чтобы я мог динамически загружать времена:

dayArray = [
schedule.every().sunday,
schedule.every().monday,
schedule.every().tuesday,
schedule.every().wednesday,
schedule.every().thursday,
schedule.every().friday,
schedule.every().saturday
]

for i in range(1, xlsxAlarmSheet.ncols):
                for j in range(1, 8):
                    if(str(xlsxAlarmSheet.cell_value(j, i)) != '0'):
                        dayArray[j - 1].at(str(xlsxAlarmSheet.cell_value(j, i))[:2] + ':' + str(xlsxAlarmSheet.cell_value(j, i))[2:]).do(job)

Дни загружаются из массива, а времена из файла xlsx через модуль XLRD. Единственная проблема заключается в том, что сигналы тревоги перезаписывают друг друга, когда я планирую несколько раз на один день. Если я планирую 3 раза на воскресенье с помощью этого метода, например, только третье запланированное время сработает. Я думал, что это должно быть потому, что когда я загружаю дни в массив, они как-то перестают быть уникальными, поэтому я попытался создать двумерный массив:

dayArray = [[
schedule.every().sunday,
schedule.every().monday,
schedule.every().tuesday,
schedule.every().wednesday,
schedule.every().thursday,
schedule.every().friday,
schedule.every().saturday
]] * (xlsxAlarmSheet.ncols - 1)

for i in range(1, xlsxAlarmSheet.ncols):
                for j in range(1, 8):
                    if(str(xlsxAlarmSheet.cell_value(j, i)) != '0'):
                        dayArray[i - 1][j - 1].at(str(xlsxAlarmSheet.cell_value(j, i))[:2] + ':' + str(xlsxAlarmSheet.cell_value(j, i))[2:]).do(job)

Без удачи ... времена все ещепереписываете друг друга, есть идеи?

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Я думаю, вам может понадобиться использовать индекс для хранения ваших значений. Эта ссылка может помочь. https://treyhunner.com/2016/04/how-to-loop-with-indexes-in-python/#What_if_we_need_indexes?

1 голос
/ 21 октября 2019

Отказ от ответственности: 0 Опыт работы с Python, только JavaScript .... Но ...

Старайтесь не вызывать функцию в массиве таких объектов:

dayArray = [[
schedule.every().sunday,
...

Вместо этого простоиметь имя дня (единственная часть, которая меняется)

dayArray = [[
'sunday', 'monday', ...

Затем для каждого использования это имя строки при построении функции

for each .... { schedule.every()[dayArray[i]].at(...).do(...) }

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

Надеюсь, это имеет смысл. Не знаю, сработает ли это, просто что-то попробую. Удачи.

0 голосов
/ 21 октября 2019

В другом вопросе, который я разместил , я первоначально пытался заменить атрибут дня строкой, как предлагает Виг в своем ответе на этот пост. Это не сработало для меня, поэтому я закончил хранить объекты в массиве, как предложил Prune в своем первоначальном вопросе.

Однако Prune также опубликовал ссылку на пример (пример7) в котором весь вызов для планирования времени был сохранен в строке и затем вызван через eval(), что, кажется, работает.

Так вот, что я в итоге сделал:

dayArray = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']
dayTimeArray = []

for i in range(1, xlsxAlarmSheet.ncols):
    for j in range(1, 8):
        if(str(xlsxAlarmSheet.cell_value(j, i)) != '0'):
            dayTimeArray.append(
                "schedule.every().{}.at('{}').do(StartSubProcess)".format(
                    dayArray[j - 1], 
                    str(xlsxAlarmSheet.cell_value(j, i))[:2] + ':' + str(xlsxAlarmSheet.cell_value(j ,i))[2:]
                )
            )

for i in range(0, len(dayTimeArray)):
    eval(dayTimeArray[i])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...