我每天都试图通过电子邮件向自己发送一个数据帧。我已经走了这么远,一切都正常,但当我试图在特定的时间发送它时,我会收到这个错误
"第一个参数必须是可调用的"-引用了我在括号内调用函数的事实。
有什么办法解决这个问题吗?同样,现在我已经设置好了,如果我关闭程序,它会继续运行脚本以便每天执行吗?
谢谢,
def email_new(df):
message = MIMEMultipart()
message['Subject'] = "Subject"
message['From'] = 'email@outlook.com'
message['To'] = 'email@gmail.com'
html = MIMEText(df.to_html(index=False), "html")
message.attach(html)
with smtplib.SMTP("smtp.office365.com", 587) as server:
server.starttls()
server.login('email@outlook.com','password')
server.sendmail('email@outlook.com', 'email.edu', message.as_string())
schedule.every().day.at('17:40').do(email_new(df))
while True:
schedule.run_pending()
time.sleep(1)
do()
在第二个参数中获取要传递给函数的参数
schedule.every().day.at('17:40').do(email_new,df)
我不熟悉这个.do
方法,但通常情况下,您可以使用functools.partial
部分实例化email_new
函数。通过这种方式,您可以直接将部分实例化的email_new
函数传递给.do
方法。
让我们从一个玩具例子开始:
from functools import partial
def add_two_numbers(x, y):
return x + y
add_5_10 = partial(add_two_numbers, 5, 10)
print(add_5_10()) # 15
现在用你的例子:
from functools import partial
def email_new(df):
message = MIMEMultipart()
message['Subject'] = "Subject"
message['From'] = 'email@outlook.com'
message['To'] = 'email@gmail.com'
html = MIMEText(df.to_html(index=False), "html")
message.attach(html)
with smtplib.SMTP("smtp.office365.com", 587) as server:
server.starttls()
server.login('email@outlook.com','password')
server.sendmail('email@outlook.com', 'email.edu', message.as_string())
email_new_df = partial(email_new, df)
schedule.every().day.at('17:40').do(email_new_df)
while True:
schedule.run_pending()
time.sleep(1)
至于在你离开笔记本电脑时的日程安排,我建议你学习Cron Jobs。但是,你的笔记本电脑必须是清醒的,并且能够执行这个过程。在这种情况下,也许远程电脑或树莓派可能是个好主意。
请参阅向函数传递参数的调度模块示例:https://schedule.readthedocs.io/en/stable/examples.html#pass-对工作的争论
将函数的参数作为附加参数传递给do
方法。对于您的日程安排,您将使用
schedule.every().day.at('17:40').do(email_new, df)