50

ある時点でPythonで関数を実行するにはどうすればよいですか?

例えば:

run_it_at(func, '2012-07-17 15:50:00')

そしてそれはfunc2012-07-1715:50:00に関数を実行します。

sched.schedulerを試しましたが、機能が開始されませんでした。

import time as time_module
scheduler = sched.scheduler(time_module.time, time_module.sleep)
t = time_module.strptime('2012-07-17 15:50:00', '%Y-%m-%d %H:%M:%S')
t = time_module.mktime(t)
scheduler_e = scheduler.enterabs(t, 1, self.update, ())

私に何ができる?

4

9 に答える 9

38

http://docs.python.org/py3k/library/sched.htmlからドキュメントを読む:

それから、遅延(秒単位)を計算する必要があります...

from datetime import datetime
now = datetime.now()

次に、を使用datetime.strptimeして「2012-07-17 15:50:00」を解析します(フォーマット文字列はあなたに任せます)

# I'm just creating a datetime in 3 hours... (you'd use output from above)
from datetime import timedelta
run_at = now + timedelta(hours=3)
delay = (run_at - now).total_seconds()

次に、を使用してインスタンスdelayに渡す ことができます。例:threading.Timer

threading.Timer(delay, self.update).start()
于 2012-07-17T14:01:09.883 に答える
32

Advanced Python Scheduler、APSchedulerを見てください:http://packages.python.org/APScheduler/index.html

このユースケースの例があります: http://packages.python.org/APScheduler/dateschedule.html

from datetime import date
from apscheduler.scheduler import Scheduler

# Start the scheduler
sched = Scheduler()
sched.start()

# Define the function that is to be executed
def my_job(text):
    print text

# The job will be executed on November 6th, 2009
exec_date = date(2009, 11, 6)

# Store the job in a variable in case we want to cancel it
job = sched.add_date_job(my_job, exec_date, ['text'])
于 2014-01-27T21:31:50.970 に答える
25

このライブラリをインストールする価値があるかもしれません:https ://pypi.python.org/pypi/schedule 、基本的にあなたが今説明したすべてを行うのに役立ちます。次に例を示します。

import schedule
import time

def job():
    print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)
于 2017-09-21T01:38:29.843 に答える
13

Python2.7を使用したAPSchedulerのバージョン3.5に対するstephenbezの回答の更新は次のとおりです。

import os, time
from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime, timedelta


def tick(text):
    print(text + '! The time is: %s' % datetime.now())


scheduler = BackgroundScheduler()
dd = datetime.now() + timedelta(seconds=3)
scheduler.add_job(tick, 'date',run_date=dd, args=['TICK'])

dd = datetime.now() + timedelta(seconds=6)
scheduler.add_job(tick, 'date',run_date=dd, kwargs={'text':'TOCK'})

scheduler.start()
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

try:
    # This is here to simulate application activity (which keeps the main thread alive).
    while True:
        time.sleep(2)
except (KeyboardInterrupt, SystemExit):
    # Not strictly necessary if daemonic mode is enabled but should be done if possible
    scheduler.shutdown()
于 2018-03-28T01:00:58.207 に答える
3

同じ問題が発生しました。sched.enterabsで認識されるように登録された絶対時間イベントを取得できませんでしたsched.runsched.enterを計算した場合はうまくdelayいきましたが、特定のタイムゾーンの特定の時刻にジョブを実行する必要があるため、使用するのが面倒です。

私の場合、問題はtimefuncsched.scheduler初期化子のデフォルトがtime.timeのように)ではなく、であることに気付きましたtime.monotonicドキュメントによると、「戻り値の参照ポイントは未定義であるため、連続した呼び出しの結果の差のみが有効である」time.monotonicため、「絶対」タイムスケジュールには意味がありません。

私にとっての解決策は、スケジューラを次のように初期化することでした

scheduler = sched.scheduler(time.time, time.sleep)

time_module.timeが実際にtime.timeであるかtime.monotonicであるかは不明ですが、正しく初期化すると正常に機能します。

于 2015-06-10T13:54:49.760 に答える
3

冒頭の投稿のコードが機能していることを確認しましたが、不足していscheduler.run()ます。テストされ、スケジュールされたイベントが実行されます。これがもう1つの有効な答えです。

>>> import sched
>>> import time as time_module
>>> def myfunc(): print("Working")
...
>>> scheduler = sched.scheduler(time_module.time, time_module.sleep)
>>> t = time_module.strptime('2020-01-11 13:36:00', '%Y-%m-%d %H:%M:%S')
>>> t = time_module.mktime(t)
>>> scheduler_e = scheduler.enterabs(t, 1, myfunc, ())
>>> scheduler.run()
Working
>>>
于 2020-01-11T18:37:00.780 に答える
1
dateSTR = datetime.datetime.now().strftime("%H:%M:%S" )
if dateSTR == ("20:32:10"):
   #do function
    print(dateSTR)
else:
    # do something useful till this time
    time.sleep(1)
    pass

Time of Day / Dateイベントトリガーを探すだけです。日付「string」が更新された「time」文字列に関連付けられている限り、単純なTOD関数として機能します。文字列を日付と時刻に拡張できます。

辞書式順序であろうと時系列順序の比較であろうと、文字列が特定の時点を表す限り、文字列も同様になります。

誰かが親切にこのリンクを提供しました:

Pythonで使用される文字列比較手法

于 2016-09-05T01:12:18.183 に答える
0

これらの答えを必要な方法で機能させるのに本当に苦労しました、

しかし、私はこれを機能させ、0.01秒まで正確にしています

from apscheduler.schedulers.background import BackgroundScheduler
    
sched = BackgroundScheduler()
sched.start()

def myjob():
    print('job 1 done at: ' + str(dt.now())[:-3])

dt = datetime.datetime
Future = dt.now() + datetime.timedelta(milliseconds=2000)
job = sched.add_job(myjob, 'date', run_date=Future)

このコードでタイミングの精度をテストしました:最初は2秒と5秒の遅延を行いましたが、より正確な測定でテストしたかったので、2.55秒の遅延と5.55秒の遅延で再試行しました

dt = datetime.datetime
Future = dt.now() + datetime.timedelta(milliseconds=2550)
Future2 = dt.now() + datetime.timedelta(milliseconds=5550)

def myjob1():
    print('job 1 done at: ' + str(dt.now())[:-3])
def myjob2():
    print('job 2 done at: ' + str(dt.now())[:-3])

print(' current time: ' + str(dt.now())[:-3])
print('  do job 1 at: ' + str(Future)[:-3] + ''' 
  do job 2 at: ''' + str(Future2)[:-3])
job = sched.add_job(myjob1, 'date', run_date=Future)
job2 = sched.add_job(myjob2, 'date', run_date=Future2)

そしてこれらの結果を得ました:

 current time: 2020-12-10 19:50:44.632
  do job 1 at: 2020-12-10 19:50:47.182 
  do job 2 at: 2020-12-10 19:50:50.182
job 1 done at: 2020-12-10 19:50:47.184
job 2 done at: 2020-12-10 19:50:50.183

1回のテストで0.002秒の精度

しかし、私は多くのテストを実行し、精度は.002から.011の範囲でした

2.55秒または5.55秒の遅延を下回ることはありません

于 2020-12-11T03:56:36.213 に答える
-1
#everytime you print action_now it will check your current time and tell you should be done

import datetime  
current_time = datetime.datetime.now()  
current_time.hour  

schedule = {
    '8':'prep',
    '9':'Note review',
    '10':'code',
    '11':'15 min teabreak ',
    '12':'code',
    '13':'Lunch Break',
    '14':'Test',
    '15':'Talk',
    '16':'30 min for code ',
    '17':'Free',
    '18':'Help ',
    '19':'watever',
    '20':'watever',
    '21':'watever',
    '22':'watever'
}

action_now = schedule[str(current_time.hour)]
于 2020-12-30T11:43:22.383 に答える