#python #datetime
#python #datetime
Вопрос:
Я пытаюсь запустить функцию один раз в определенное время. Я использовал свой код следующим образом:
import pytz
import datetime
import time
def test_1():
print("Working_1")
def test_2():
print("Working_2")
while True:
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
if current_time == '2019-03-18T19:00:36Z':
test_1()
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
if current_time > '2019-03-18T19:00:36Z':
break
if current_time == '2019-03-18T19:00:36Z':
test_2()
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
if current_time > '2019-03-18T19:00:36Z':
break
Когда я запускаю свой код, он запускает первую функцию, за которой следует вторая, до выполнения конечного условия.
Я хочу, чтобы функция выполнялась в указанное время в if
инструкции.
Я думаю, что проблема возникает из-за того, как циклы являются вложенными. Я пробовал несколько конфигураций if
инструкции и условия прерывания, но просто не могу ее получить.
Любая помощь была бы высоко оценена, приветствия. Сэнди
Комментарии:
1. почему в вашем коде двойной интервал ..?
2. Я просто считаю, что это немного легче читать.
3. В чем проблема с вашим кодом? Почему это не оправдало ожиданий?
4. Я хотел бы, чтобы функции выполнялись в моменты, указанные в инструкции if. В будущем это должно быть изменено на sompoint.
5. Все четыре ваших
if
оператора сравниваются с одним и тем же временем. Из вашего поста я понял, что вы хотите, чтобы что-то происходило в разное время. Я бы начал с этого.
Ответ №1:
Я полагаю, что ваш код здесь не работает, потому что для этого потребовалось бы, чтобы время точно соответствовало заданной временной метке, а при учете времени выполнения, даже минимального, это совершенно нереально. Возможным решением является предоставление «временной подушки», то есть окна вокруг времени выполнения, а не точного соответствия для оператора if; однако это все еще довольно ненадежно.
Если вы не возражаете против использования внешнего модуля, я бы порекомендовал вам взглянуть на sched или APScheduler. Я лично использовал последнее, и оно отлично работает.
Ответ №2:
Исходя из моих предположений о том, чего вы хотите: Вы хотите, чтобы обе функции выполнялись по порядку в определенное время, да? Должно работать что-то намного более простое, например, это:
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
while current_time < '2019-03-18T19:00:36Z':
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
test_1()
test_2()
Это приведет к запуску обеих функций, как только часы пробьют ваше целевое время.
РЕДАКТИРОВАТЬ: Если вы хотите, чтобы они запускались в два разных времени:
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
while current_time < '<first_time>':
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
test_1()
while current_time < '<second_time>':
current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M:%SZ')
test_2()
(где <first_time>
это первое в хронологическом порядке)
Комментарии:
1. Current_time можно сравнить
'2019-03-18T18:35:36Z' > '2019-03-18T18:34:36Z'
возвращает true2. Что, если я хочу, чтобы функции запускались в определенное время. Возможно, этот код поможет вам понять мой вопрос
def time(): current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M') while current_time == '2019-03-18T19:37': current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M') test_1() while current_time == '2019-03-18T19:38': current_time = datetime.datetime.now(pytz.timezone('GMT')).strftime('%Y-%m-%dT%H:%M') test_2()