【问题标题】:Issue with script that automatically runs at particular time every day每天在特定时间自动运行的脚本问题
【发布时间】:2023-06-23 05:13:01
【问题描述】:

我希望以后每天早上 8 点自动运行一个 python 文件。我尝试在 Windows 中使用schedule 中指出的库second answer here

import schedule
import time

def query_fun(t):

  print('Do a bunch of things')
  print("I'm working...", t)
  df.to_csv('C:/Documents/Query_output.csv', encoding='utf-8')

schedule.every().day.at("08:00").do(query_fun, 'It is 08:00')


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

但是早上 8 点来了又走了,csv 文件还没有更新,而且看起来脚本不像我想要的那样运行。

编辑:基于this,我使用pythonw.exe在命令行中运行脚本:C:\Program Files\Python3.7>pythonw.exe daily_query.py,但脚本没有按预期运行。

【问题讨论】:

    标签: python windows schedule


    【解决方案1】:

    您通过注释掉了脚本的关键部分。脚本是如何神奇地在早上 8 点起床做某事的?关键是始终使用schedule 库提供的机制保持它运行并在正确的时间触发(即在 D 日的时间 T 运行任何待处理的作业)。您现在所做的只是声明方法并退出而不做任何事情。

    关键是保持脚本在后台运行,并通过将当前时间与指定时间相匹配来触发函数,根据您的逻辑运行任何待处理的分配作业。你在后台运行你的脚本,直到早上 8 点才忘记它:

    nohup python MyScheduledProgram.py &
    

    nohup 会注意您的终端不会从程序中打印出任何输出。不过,您可以查看来自nohup.out 的输出。

    【讨论】:

    • 谢谢,但是对于 Windows 是否有相同的答案?
    【解决方案2】:

    Here 你可以很容易地看到脚本做了什么:

    schedule.every().day.at("08:00").do(query_fun, 'It is 08:00')
    

    如果是上午 8 点,则告诉调度程序运行该函数。 但图书馆的另一部分是这个:

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

    这部分检查是否应该启动一个脚本,然后等待 60 秒,然后再次检查。

    编辑:

    问题与Windows机器有关,因此我的回答在这里没有意义。

    如果你在 linux 机器上,你应该考虑使用 crontabs:

    打开终端并输入 crontab -e

    在你选择了你想要的编辑器(让我们拿 nano)之后,它会打开一个列表,你可以在其中添加各种条目

    只需添加:

    0 8 * * * /usr/bin/python3 /home/path/to/skript.py
    

    然后用 STRG + O 保存并用 STRG + X 退出 nano

    脚本将在每天早上 8 点运行,只需测试命令

    /usr/bin/python3 /home/path/to/skript.py 
    

    确保脚本不会产生错误

    【讨论】:

    • df.to_csv('C:/Documents/Query_output.csv'...) 行是否告诉您询问者是否使用 Linux,以及他们是否可以使用 cron