2013-02-26 9 views

Antwort

32

Sie können das tun wie folgt aus:

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

Diese Funktion ausgeführt wird (zB hello_world.) In den nächsten Tag bei 01.00

+1

Ich muss dies tun * jeden * Vormittag ... –

+1

Der Callback kann beim ersten Aufruf einen anderen 'Timer' starten. – FakeRainBrigand

+5

Korrektur der Datumslogik: x = datetime.today() y = (x + Zeitdelta (Tage = 1)). Ersetzen (Stunde = 2, Minute = 0, Sekunde = 0) delta_t = y - x –

11

APScheduler könnte das sein, wonach Sie suchen.

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/

Sie können es nur ein Einen Lauf zu planen, indem die in die Funktion den Aufbau Sie planen werden.

+0

Dies funktioniert nicht für Version 3 von Apscheduler. Kennt jemand ein ähnliches Beispiel mit der aktuellen Syntax, habe ich Probleme http://stackoverflow.com/q/30280203/2327821 – Michael

+0

Der Link funktioniert nicht mehr – aaa

+0

Funktioniert nicht für Python 3 – Anarach

47

Ich verbrachte ziemlich viel Zeit auch um ein einfaches Python-Programm um 01:00 Uhr zu starten. Aus irgendeinem Grund konnte ich nicht cron zu starten und APScheduler schien ziemlich komplex für etwas, das einfach sein sollte. Zeitplan (https://pypi.python.org/pypi/schedule) schien in etwa richtig.

Sie müssen ihre Python-Bibliothek installieren:

pip install schedule 

Diese von ihrem Beispielprogramm modifiziert:

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 

Sie benötigen, um Ihre eigene Funktion anstelle von Job setzen und ausführen mit nohup, zB:

nohup python2.7 MyScheduledProgram.py & 

Vergessen Sie nicht, es beim Neustart erneut zu starten.

+3

Wer diesen Thread in Zukunft sieht, hofft, dass er versteht, dass dies die richtige Lösung für einen Produktionscode ist und nicht die akzeptierte. – yeaske

+0

Funktioniert das auf Mac, Linux und Windows? Oder dieses Skript benötigt einige Änderungen? @yeaske – ppmakeitcount

+0

Ich benutze es auf Linux und es sollte auf Mac funktionieren. Windows, ich bin mir nicht sicher. Es ist jedoch keine große Investition, es sorgfältig einzurichten und zu testen. Ich würde das auf jeden Fall empfehlen, da Scheduler ein bisschen schwierig sind. – user2099484

5

Ich brauchte etwas ähnliches für eine Aufgabe. Dies ist der Code, den ich schrieb: Es berechnet den nächsten Tag und ändert die Zeit zu was auch immer benötigt wird und findet Sekunden zwischen currentTime und nächsten geplanten Zeit.

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