如何让我的脚本在 Windows 上使用 python 每 30 分钟重复一次

Posted

技术标签:

【中文标题】如何让我的脚本在 Windows 上使用 python 每 30 分钟重复一次【英文标题】:how to get my script to repeat every 30 mins with python on windows 【发布时间】:2018-07-26 09:34:12 【问题描述】:

我有下面的脚本,我希望它每 30 分钟运行一次,有人可以为我指出正确的方向。

我已经搜索过这样的现有问题,但似乎没有找到任何适用于我的脚本的想法,但不知道这是否是我的愚蠢。

我的脚本在我的屏幕点击时转到不同的位置,然后进行屏幕截图,然后将图像发送到我的 gmail 帐户。

import pyautogui
import time
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email import encoders
import os


time.sleep(5)
pyautogui.PAUSE = 1
pyautogui.moveTo(922,134)
pyautogui.click()
pyautogui.PAUSE = 1
pyautogui.moveTo(178,277)
pyautogui.click()
pyautogui.PAUSE = 1
pyautogui.moveTo(178,297)
pyautogui.click()
pyautogui.PAUSE = 1
pyautogui.moveTo(178,315)
pyautogui.click()
pyautogui.PAUSE = 1
pyautogui.screenshot('web.png')

pyautogui.PAUSE = 5

gmail_user = "user@gmail.com"
gmail_pwd = "password"

to = "user@gmail.com"
subject = "Report"
text = "Picture report"
attach = 'web.png'

msg = MIMEMultipart()

msg['From'] = gmail_user
msg['To'] = to
msg['Subject'] = subject

msg.attach(MIMEText(text))

part = MIMEBase('application', 'octet-stream')
part.set_payload(open(attach, 'rb').read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',
   'attachment; filename="%s"' % os.path.basename(attach))
msg.attach(part)

mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmail_user, gmail_pwd)
mailServer.sendmail(gmail_user, to, msg.as_string())
# Should be mailServer.quit(), but that crashes...
mailServer.close()

【问题讨论】:

为什么不创建一个每 30 分钟执行一次脚本的任务? 为什么不使用time.sleep(30*60) 将代码封装在无限循环中? ***.com/questions/132971/… Linux 有 crontab。我从来没有在 Windows 上使用过这样的东西,但该链接似乎有几种可能的解决方案。 嗨,我是 python 新手,所以我还在学习,所以不太确定如何将其编写为任务或将其置于无限循环中,请给我一个示例 重复***.com/questions/4249542/… 【参考方案1】:

我相信 time.sleep(),如其余答案所述,即使不使用也会占用处理器。

我有一个类似的要求,我必须运行一段代码,而且每 30 分钟连接一次服务器,否则会超时。

这就是我所做的

import time
start = time.time()
process_time = 0
max_processing_time = 20000
sleep_time = 1800

while process_time < max_processing_time:
    if (time.time() - start) > sleep_time:
        start = time.time()
        service = service_connect() ## Connect to server every 30 minutes
    
    ## Otherwise keep on running this code
    function_which_I_want_to_run_continously()

在您的方案中,您可以在“if”块中插入您的代码部分。您可以根据自己的需要设置max_processing_timesleep_time

【讨论】:

在我看来这个版本一直在使用CPU; as far as I can tell, Python's time.sleep() does release the CPU【参考方案2】:
    包装程序(如果需要,请确保通过设置环境变量来提供凭据) Create a batch file命令处理器运行python程序 Create a task in Windows Scheduler触发批处理文件

【讨论】:

嗨,如果我创建一个 exe 文件,我可以这样做吗【参考方案3】:

假设您的原始脚本的文件名是 testfile.py

使用此代码在与第一个文件相同的目录中创建另一个文件:

import time,os
while 1:
    time.sleep(1800)
    os.system("start python testfile.py")

无论脚本运行多长时间,运行此脚本都会每 30 分钟运行一次您的其他文件!

【讨论】:

挑剔:如果任务本身持续 20 分钟,则不会每 30 分钟运行一次脚本,而是每 50 分钟运行一次。 @Jean-FrançoisFabre 我已将其更改为每 20 分钟运行一次,无论运行时间长短 这可能不是一个可行的解决方案。即使 python 程序在指定的时间内休眠,它只是您要求 python 不执行任何操作,这意味着 Python 编译器仍在使用您的处理器。如果程序执行只持续 10 秒怎么办?你牺牲了处理器 29 分 50 秒。 在任何形式的 Unix 中,CPU 在 sleep() 调用期间被释放。很确定这是 Python 的 time.sleep() 的情况。如果我错了,请更新!【参考方案4】:

使用 windows schtasks:

schtasks /create /sc minute /mo 30 /tn "PyAutoGUI Task" /tr "python <path to script>"

【讨论】:

这是更好的解决方案。 嗨,我会这样做吗【参考方案5】:

你的循环应该是这样的:

while '1' == '1':
    '''
    Your script that should loop here
    '''
    time.sleep(1800)

【讨论】:

while True: ... 是它的一个更好的版本。 这只是我的一个习惯,我真的需要打破哈哈 当我运行上面的脚本时,它只是打开然后关闭 @scott.turner 你需要导入时间才能让它工作,看看我的 我只是离开了你的代码@scott.turner,我只是给你循环你的代码的其余部分(不包括你的导入)。将您的导入保留在这部分代码之外,您不需要继续导入。

以上是关于如何让我的脚本在 Windows 上使用 python 每 30 分钟重复一次的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 VB.net 程序在 Windows XP 上运行?

如何让我的用户脚本在隔离沙箱和 unsafeWindow 中执行代码?

如何使用 pip 包安装程序让我的 scikit-learn 库在 Windows 上工作?

如何让我的 init.d 脚本更改用户

如何让我的 XSLT 脚本深入了解 2 个文档并将数据编译成一个 HTML 文件?

在 PowerShell 脚本中访问 Windows 任务凭据