web-dev-qa-db-ja.com

Python-指定された時間に関数を開始する

特定の時間にPythonで関数を実行するにはどうすればよいですか?

例えば:

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

2012-07-17 15:50:00にfunc関数を実行します。

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, ())

私に何ができる?

24
microo8

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()
20
Jon Clements

詳細をご覧ください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'])
17
stephenbez

Python 2.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()
11
user1106278

このライブラリをインストールする価値があるかもしれません: 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)
9
daniel galarza

同じ問題にぶつかりました:_sched.enterabs_で登録された絶対時間イベントを_sched.run_で認識できませんでした。 _sched.enter_はdelayを計算すればうまくいきましたが、特定のタイムゾーンで特定の時間にジョブを実行したいので使用するのは面倒です。

私の場合、問題は_sched.scheduler_初期化子のデフォルトのtimefuncが_time.time_ではなく( example のように)、むしろ_time.monotonic_です。 _time.monotonic_は、「 docs 、」から、「絶対」タイムスケジュールには意味がありません。「戻り値の参照ポイントは定義されていないため、連続した結果の差のみが呼び出しは有効です。」

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

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

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

3
Eric Westphal
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

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

文字列が特定の時点を表す限り、辞書式順序か時系列順序比較かに関係なく、文字列も同様です。

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

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

1
mAd