#python #r #rstudio #smtplib #reticulate
#python #r #rstudio #smtplib #reticulate
Вопрос:
Я использую планировщик задач 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!
"""
Ответ №1:
Эта проблема с выполнением
Это работает правильно, когда я запускаю его построчно из RStudio. Проблема в том, что это не работает, когда скрипт выполняется по расписанию
может быть вызвано несколькими причинами:
-
У вас есть несколько версий Python, где
smtplib
установлена одна версия (например, Python 2.7 или Python 3.6), а другая — нет. Проверьте, какой Python используется в командной строке,Rscript -e "print(Sys.which("python"))"
и RStudio,Sys.which("python")
. Явно определите, какой Python.exe для запуска с помощью reticulateuse_python("/path/to/python")
.
-
У вас есть несколько версий R, где Rscript использует версию, отличную от RStudio. Проверьте
R.home()
переменную в обоих:Rscript -e "print(R.home())"
и вызовеR.home()
в RStudio. Явно вызовите требуемый Rscript в соответствующей папке R версии bin:/path/to/R #.#/bin/Rscript "/path/to/code.R"
.
-
У вас есть несколько
reticulate
пакетов, установленных в одной версии R, находящихся в разных расположениях библиотеки, каждый из которых вызывает другую версию Python. Проверьте с помощью matrix:installed.package()
, определяя местонахождениеreticulate
строки. Явный вызовlibrary(reticulate, lib.loc="/path/to/specific/library")
.
Комментарии:
1. Спасибо, Парфе! Я попробую все эти решения и сообщу, что работает. PS Увидимся на следующем CRUG или ChiPy.
2. Ха-ха! Рад помочь, товарищ чикагец!
3. Оказывается, мне просто нужно было использовать абсолютный путь к файлу скрипта python: source_python(«C:/My_Folders/…/setup_smtp.py «). Ошибка новичка! Еще раз спасибо за подробное устранение неполадок, хотя, когда у меня возникает реальная проблема 🙂