我每天使用Windows Task Scheduler多次运行R脚本。该脚本转换一些新数据并将其添加到现有数据文件中。
我想使用reticulate调用一个Python脚本,该脚本将向我发送一封电子邮件,列出添加了多少行数据,以及是否发生了任何错误。当我在RStudio中逐行运行它时,它可以正常工作。问题是,当脚本按计划运行时,它无法工作。我得到以下错误:
Error in py_run_file_impl(file, local, convert) :
Unable to open file 'setup_smtp.py' (does it exist?)
Error in py_get_attr_impl(x, name, silent) :
AttributeError: module '__main__' has no attribute 'message'
Calls: paste0 ... py_get_attr_or_item -> py_get_attr -> py_get_attr_impl
Execution halted这个github answer https://github.com/rstudio/reticulate/issues/232)让人觉得reticulate只能在RStudio中使用--至少对于我正在尝试做的事情来说是这样的。有没有人有建议?
示例R脚本:
library(tidyverse)
library(reticulate)
library(lubridate)
n_rows <- 10
time_raw <- now()
result <- paste0("\nAdded ", n_rows,
" rows to data file at ", time_raw, ".")
try(source_python("setup_smtp.py"))
message_final <- paste0(py$message, result)
try(smtpObj$sendmail(my_email, my_email, message_final))
try(smtpObj$quit())Python脚本("setup_smtp.py")如下所示:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Call from reticulate to log in to email
"""
import smtplib
my_email = '...'
my_password = '...'
smtpObj = smtplib.SMTP('smtp.office365.com', 587)
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(my_email, my_password)
message = """From: My Name <email address>
To: My Name <email address>
Subject: Test successful!
"""发布于 2019-04-10 04:00:28
这个执行问题
当我在RStudio中逐行运行它时,
它可以正常工作。问题是,当脚本按计划运行时,它不起作用
原因有很多:

您有多个Python版本,其中smtplib安装在一个版本(例如,Python2.7或Python3.6)上,而不是另一个版本上。检查在命令行、Rscript -e "print(Sys.which("python"))"和RStudio、Sys.which("python")中使用的是哪种Python。显式定义与reticulate的use_python("/path/to/python")一起运行的Python.exe。

您有多个R版本,其中Rscript使用与RStudio不同的版本。在两个地方检查R.home()变量:Rscript -e "print(R.home())"并在RStudio中调用R.home()。显式调用相应R版本bin文件夹中所需的Rscript:/path/to/R #.#/bin/Rscript "/path/to/code.R"。

您在同一R版本上安装了多个Python包,它们驻留在不同的库位置,每个包调用不同的reticulate版本。检查矩阵:installed.package(),找到reticulate行。显式调用library(reticulate, lib.loc="/path/to/specific/library")。
https://stackoverflow.com/questions/55599096
复制相似问题