Планирование команды печати в определенные моменты времени после запуска сценария в Python

Я хочу запланировать текст "Привет, мир" в разное время (сформировать список), так как скрипт запущен. Каков будет лучший способ сделать это?

Это, наверное, неправильно, но то, что я пока имею:

import time
times = [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369] #at these times since onset of script, a text "hello world" should be printed

start = time.time()

def main():
    for cuetime in times:
        print ('hello world', ' - timing: ', cuetime, ' - now: ', time.time()- start)
    yield viztask.waitTime(cuetime)

main()

Это дает мне:

('hello world', ' - timing: ', 1.76493425, ' - now: ', 0.0)
('hello world', ' - timing: ', 3.10174059, ' - now: ', 1.7699999809265137)
('hello world', ' - timing: ', 4.49576803, ' - now: ', 3.5379998683929443)
('hello world', ' - timing: ', 10.99379224, ' - now: ', 5.305999994277954)
('hello world', ' - timing: ', 18.84178369, ' - now: ', 7.075000047683716)

Но что мне действительно нужно, так это то, что элементы / элементы синхронизации должны совпадать со временем "сейчас", потому что элементы в списке синхронизации являются временами, в которые текст "привет мир" должен быть напечатан относительно начала сценария.,

2 ответа

Решение

Как насчет schedule модуль. Раньше не работал с ним, но вы можете достичь своей цели довольно легко:

import schedule
import time
from functools import partial
# your specified list of times
times = [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369]
# define a job you want to do
def job(t, start):
    print ('hello world', ' - timing: ', t, ' - now: ', time.time()- start)
    # pop the job right away from schedule.jobs, so it runs only once
    return schedule.CancelJob
# get the starting time
start = time.time()
# for each time add what to do
for t in times:
    # using partial so i can pass arguments to job
    schedule.every(t).seconds.do(partial(job, t, start))
# and run it inside a lop
while True:
    schedule.run_pending()
    # schedule.jobs is just a list of jobs
    if not schedule.jobs:
        break

Распечатывает:

hello world  - timing:  1.76493425  - now:  1.7650279998779297
hello world  - timing:  3.10174059  - now:  3.101846933364868
hello world  - timing:  4.49576803  - now:  4.495898962020874
hello world  - timing:  10.99379224  - now:  10.993950605392456
hello world  - timing:  18.84178369  - now:  18.84195566177368

Посмотрите на sched библиотека для более подробной информации. Вот пример кода, который не является на 100% точным, но должен помочь, если вам не нужна точность в миллисекундах.

import time
import sched

def print_time(cuetime):
    global start
    print ('hello world', ' - timing: ', cuetime, ' - now: ', time.time()- start)

start = time.time()
times = [1.76493425, 3.10174059, 4.49576803, 10.99379224, 18.84178369] 

if __name__ == "__main__":
    s = sched.scheduler(time.time, time.sleep)
    for cuetime in times:
        s.enter(cuetime, 1, print_time, (cuetime,))
    s.run()
Другие вопросы по тегам