web-dev-qa-db-ja.com

毎日同じ時間に何かをするPythonスクリプト

毎朝01:00に実行したい長時間実行pythonスクリプトがあります。

sched モジュールと Timer オブジェクトを見てきましたが、これらを使用してこれを達成する方法がわかりません。

60
Paul McKenzie

次のようにできます:

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 a.mに関数(hello_worldなど)が実行されます。

編集:

@PaulMagが示唆するように、より一般的には、月末に到達したために月の日付をリセットする必要があるかどうかを検出するために、このコンテキストでのyの定義は次のようになります。

y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)

この修正では、インポートにタイムデルタを追加する必要もあります。他のコード行も同じです。したがって、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()
47
sissi_luaty

また、01:00に簡単なPythonプログラムを起動しようとかなりの時間を費やしました。なんらかの理由で、cronを取得できず、APSchedulerは単純なものに対してはかなり複雑に見えました。スケジュール( https://pypi.python.org/pypi/schedule )はほぼ正しいように思えました。

Pythonライブラリをインストールする必要があります。

pip install schedule

これは、サンプルプログラムから変更されています。

import schedule
import time

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

schedule.every().day.at("01:00").do(job,'It is 01:00')

while True:
    schedule.run_pending()
    time.sleep(60) # wait one minute

ジョブの代わりに独自の関数を配置し、Nohupで実行する必要があります。例:

Nohup python2.7 MyScheduledProgram.py &

再起動する場合は、再起動することを忘れないでください。

148
user2099484

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/

スケジュールしている関数にそれを組み込むことで、別の実行をスケジュールすることができます。

13

タスクに似たようなものが必要でした。これは私が書いたコードです。次の日を計算し、必要な時間に時刻を変更し、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()
7
Ankit