在 Python 中脚本启动后的特定时间安排打印命令

scheduling a print command at specific timings after the script started in Python

我想在不同的时间安排文本 'hello world'(形成一个列表),因为脚本已经启动。最好的方法是什么?

这可能是错误的,但我目前所知道的是:

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)

但我真正需要的是时间 elements/items 与 "now" 时间相同,因为时间列表中的元素是文本 "hello world" 的时间应该相对于脚本的开始打印。

查看 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()

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