私は、毎朝 01:00 に実行したい長時間実行される Python スクリプトを持っています。
質問する
302379 次
4 に答える
86
次のようにできます。
from datetime import datetime
from threading import Timer
x=datetime.today()
y=x.replace(day=x.day+1, hour=1, minute=0, second=0, microsecond=0)
delta_t=y-x
secs=delta_t.seconds+1
def hello_world():
print "hello world"
#...
t = Timer(secs, hello_world)
t.start()
これにより、翌日の午前 1 時に関数 (hello_world など) が実行されます。
編集:
@PaulMag で提案されているように、より一般的には、月末に達したために月の日をリセットする必要があるかどうかを検出するために、このコンテキストでの y の定義は次のようになります。
y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)
今回の修正では、timedelta をインポートに追加する必要もあります。他のコード行は同じままです。したがって、total_seconds() 関数も使用する完全なソリューションは次のとおりです。
from datetime import datetime, timedelta
from threading import Timer
x=datetime.today()
y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)
delta_t=y-x
secs=delta_t.total_seconds()
def hello_world():
print "hello world"
#...
t = Timer(secs, hello_world)
t.start()
于 2013-02-26T13:54:01.123 に答える
20
APScheduler は、あなたが求めているものかもしれません。
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'])
# The job will be executed on November 6th, 2009 at 16:30:05
job = sched.add_date_job(my_job, datetime(2009, 11, 6, 16, 30, 5), ['text'])
https://apscheduler.readthedocs.io/en/latest/
スケジュールしている関数にそれを組み込むことで、別の実行をスケジュールすることができます。
于 2013-02-26T13:35:35.217 に答える
10
タスクに似たものが必要でした。これは私が書いたコードです: 次の日を計算し、時間を必要なものに変更し、 currentTime と次のスケジュールされた時間の間の秒数を見つけます。
import datetime as dt
def my_job():
print "hello world"
nextDay = dt.datetime.now() + dt.timedelta(days=1)
dateString = nextDay.strftime('%d-%m-%Y') + " 01-00-00"
newDate = nextDay.strptime(dateString,'%d-%m-%Y %H-%M-%S')
delay = (newDate - dt.datetime.now()).total_seconds()
Timer(delay,my_job,()).start()
于 2015-10-21T15:04:29.930 に答える