2016-05-17 14 views
2

我想在各种时间安排一个文本'hello world'(形成一个列表),因为脚本已经启动。什么是最好的方法来做到这一点?在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) 

但我真正需要的是时间要素/项目是一样的“现在”时间,因为时间列表中的元素是相对于剧本开始应该打印文本“hello world”的时间。

回答

0

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 
+1

感谢quapka的方式,这是优秀的,特别是评论,这使它透明。 – Spica

+0

我很高兴它有帮助。有改进它的空间。每次可能传递'start'。出于某种原因,我想到了装饰器和背景管理器。但是,如果我想这些工作更复杂,那将会很有趣。 – quapka

1

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

感谢吕克,调度是definetely去 – Spica