2010-12-28 37 views
0

私は毎月の最終日にpython schedを使用して実行するように機能をスケジュールしたいと思います。python - 毎月の最終日に実行するように関数をスケジュールする方法は?

誰でも私の同じことを助けることができますか? crontabファイルと

+0

多分、あなたが探しているものがもっとあります。 – ykatchou

+0

schedはcronのようなスケジューリングに使用されます。 – samy

+0

OS固有のタスクスケジューラを使用して、その関数を含むPythonスクリプトを実行するように設定できます。前者の方法は使用するOSとタスクスケジューラによって異なります。 'sched'モジュールは、このようなことをするために設計されたものではありません。 – martineau

答えて

1

を実行し、毎日、それはcalendar.monthrangeを使用して、月の最後の日であるかどうかを確認:あなたは別のPythonのSCHEDについて話している場合を除き

import datetime, calendar 
today = datetime.date.today() 
if calendar.monthrange(today.year, today.month)[1] != today.day: 
    exit() 

パイソンschedとのcrontabは、同じリーグではありません。 Windowsにも同様のスケジューラがあるか、cygwin crontabをインストールすることができます。

システムワイドタスクスケジューラがない奇妙なプラットフォームにいる場合は、上記のテストとtime.sleep(24 * 60 * 60)秒などを実行する無限ループを残すことができます。

+0

os特有のスケジューラ(cronのような)が1日1回スケジュールする必要がある場合は、スケジューラを使用して月? – Tomas

+0

@Tomas:AFAIK、標準のcrontabには、月の最終日に実行する構文がありません。最初の日の0時00分は簡単ですが、最終日の23時59分59.99999時とほぼ同じです。 –

1

月の最終日には、次の日付の日の値が現在の日の値よりも小さいというプロパティがあります。

現在の日からその日の終わりまでの日数を確認します。手掛かりとして上記のプロパティを使用します。詳細を見つけるには、datetimeモジュールを使用してください。

  1. は、現在の日を0から開始し、後続の各日の高い値をもたらす機能を書きます。これはあなたのtime.time()呼び出しと似ていますが、毎日です。

  2. 関数mydaydelay(num)は1日中スリープ状態になります。今

、ここでの重要な部分はtimefuncが呼び出されたときに値を返し、あなたのケースでは、それはmydaycountなり、delayfuncがmydaydelayされるanyfunctionすることができ

class sched.scheduler(timefunc, delayfunc) 

です。

そして、月の最後の日数を持つschduledオブジェクトを、関数としてのアクションとして関数として呼び出すことができます。あなたのプログラムのための

scheduler.enterabs(time, priority, action, argument) 

ラフアウトラインはこのようなものになるだろう。

import sched 
import datetime 

def mydaycount(): 
    yield int_days 

def mydaydelay(n): 
    sleep_for_days(n) 

scheduler = sched.scheduler(mydaycount, mydaydelay) 

def print_event(name): 
    print 'EVENT:', name 

n_days_to_last_day = 3 # This should be your calculate value 

scheduler.entertabs(n_days_to_last_day, 1, print_event, ('last day',)) 

scheduler.run() 
+0

ありがとうございます。同じ – samy

+0

calendar.monthrange()を試してみます。月の最終日はhttp://docs.python.org/library/calendar.htmlをご覧ください。 –

+0

@Paulo:ありがとうございます。 monthrange()は直接値を与えるかもしれませんが、上記のことは間違いなくカレンダーモジュールを使って簡単に計算できます。 –

関連する問題