0

我每天使用 Windows 任务计划程序多次运行 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 答案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!
"""
4

1 回答 1

2

这个执行问题

当我在 RStudio 中逐行运行它时,它可以正常工作。问题是当脚本按计划运行时它不起作用

可能源于多种原因:

  1. 多条蟒蛇

    您有多个 Python 版本,smtplib安装在一个版本上(例如,Python 2.7 或 Python 3.6)而不是另一个版本。检查在命令行中使用的是哪个 Python,Rscript -e "print(Sys.which("python"))"以及 RStudio Sys.which("python")、. 明确定义要使用 reticulate 运行的 Python.exe use_python("/path/to/python")


  1. 多卢比

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


  1. 多个网状结构

    您在同一个 R 版本上安装了多个reticulate包,位于不同的库位置,每个包都调用不同的 Python 版本。检查矩阵:installed.package(),找到reticulate行。显式调用library(reticulate, lib.loc="/path/to/specific/library").

于 2019-04-09T20:00:28.357 回答