在 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
我想在不同的时间安排文本 '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