Я использую планировщик заданий 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!
"""
Эта проблема с исполнением
This works correctly when I run it line by line from within RStudio. The problem is that it doesn't work when the script runs on schedule
может быть вызвано несколькими причинами:
У вас есть несколько версий Python, где smtplib
установлен в одной версии (например, Python 2.7 или Python 3.6), а не в другой. Проверьте, какой Python используется в командной строке, Rscript -e "print(Sys.which("python"))"
и RStudio, Sys.which("python")
. Явно определите, какой Python.exe запускать с помощью use_python("/path/to/python")
reticulate.
У вас есть несколько версий R, в которых Rscript использует версию, отличную от версии RStudio. Проверьте переменную R.home()
в обоих: Rscript -e "print(R.home())"
и вызовите R.home()
в RStudio. Явно вызовите требуемый Rscript в соответствующей папке bin версии R: /path/to/R #.#/bin/Rscript "/path/to/code.R"
.
У вас есть несколько пакетов reticulate
, установленных в одной и той же версии R, находящихся в разных местах библиотеки, каждый из которых вызывает свою версию Python. Сверьтесь с матрицей: installed.package()
, найдя reticulate
строку. Явный вызов library(reticulate, lib.loc = "/path/to/specific/library")
.
Ха-ха! Рад помочь, товарищ чикагец!
Оказывается, мне просто нужно было использовать абсолютный путь к файлу скрипта python: source_python("C:/My_Folders/.../setup_smtp.py"). Ошибка новичка! Еще раз спасибо за подробное устранение неполадок, когда у меня есть НАСТОЯЩАЯ проблема :)
Спасибо, Парфе! Я попробую все эти решения и сообщу, что работает. PS Увидимся на следующем CRUG или ChiPy.