2013-02-26 44 views
31

Tôi có một tập lệnh python chạy dài mà tôi muốn làm vào lúc 01:00 mỗi sáng.Kịch bản Python để làm điều gì đó cùng một lúc mỗi ngày

Tôi đã xem mô-đun sched và ở đối tượng Timer nhưng tôi không thể xem cách sử dụng các mục này để đạt được điều này.

+6

Đồng thời xem xét chạy tập lệnh riêng biệt qua [cron] (http://en.wikipedia.org/wiki/Cron). – FakeRainBrigand

+0

Có, nên nói, không có quyền truy cập vào 'cron'. –

Trả lời

32

Bạn có thể làm điều đó như thế này:

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

này sẽ thực hiện một chức năng (ví dụ hello_world.) Vào ngày hôm sau tại 01:00

+1

Tôi cần thực hiện việc này * mỗi * buổi sáng ... –

+1

Cuộc gọi lại có thể bắt đầu một 'Timer' khác khi được gọi lần đầu tiên. – FakeRainBrigand

+5

sửa logic ngày: x = datetime.today() y = (x + timedelta (ngày = 1)). Thay thế (giờ = 2, phút = 0, giây = 0) delta_t = y - x –

11

APScheduler có thể là những gì bạn đang làm sau.

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/

Bạn chỉ có thể lấy nó để lên lịch chạy khác bằng cách xây dựng đó vào chức năng bạn đang lên kế hoạch.

+0

Điều này không hoạt động đối với phiên bản 3 của apscheduler. Có ai biết một ví dụ tương tự với cú pháp hiện tại, tôi đang gặp vấn đề http://stackoverflow.com/q/30280203/2327821 – Michael

+0

Liên kết không hoạt động nữa – aaa

+0

Không hoạt động cho python 3 – Anarach

47

Tôi đã dành khá nhiều thời gian cũng tìm cách khởi chạy một chương trình Python đơn giản lúc 01:00. Vì một lý do nào đó, tôi không thể nhận được cron để khởi chạy nó và APScheduler có vẻ khá phức tạp đối với một thứ đơn giản. Lịch biểu (https://pypi.python.org/pypi/schedule) có vẻ đúng.

Bạn sẽ phải cài đặt thư viện Python của họ:

pip install schedule 

này được sửa đổi từ chương trình mẫu của họ:

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 

Bạn sẽ cần phải đặt chức năng riêng của bạn ở vị trí của công việc và chạy nó với nohup, ví dụ:

nohup python2.7 MyScheduledProgram.py & 

Đừng quên khởi động lại nếu bạn khởi động lại.

+3

Bất cứ ai nhìn thấy chuỗi này trong tương lai, hy vọng họ hiểu rằng đây là giải pháp phù hợp cho mã sản xuất chứ không phải là mã được chấp nhận. – yeaske

+0

Điều này có hoạt động trên mac, linux và windows không? Hoặc kịch bản này cần một số sửa đổi? @yeaske – ppmakeitcount

+0

Tôi sử dụng nó trên Linux và nó sẽ hoạt động trên mac. Windows, tôi không chắc chắn. Nó không phải là đầu tư lớn, tuy nhiên, để thiết lập và kiểm tra cẩn thận. Tôi sẽ khuyên rằng trong mọi trường hợp kể từ khi lên lịch là một chút khôn lanh. – user2099484

5

Tôi cần một cái gì đó tương tự cho một tác vụ. Đây là mã tôi đã viết: Nó tính toán ngày hôm sau và thay đổi thời gian cho bất cứ điều gì là cần thiết và tìm giây giữa currentTime và thời gian dự kiến ​​tiếp theo.

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