Используйте reticulate для вызова скрипта Python и отправки электронной почты

#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. Проблема в том, что это не работает, когда скрипт выполняется по расписанию

может быть вызвано несколькими причинами:

  1. Несколько Pythons

    У вас есть несколько версий Python, где smtplib установлена одна версия (например, Python 2.7 или Python 3.6), а другая — нет. Проверьте, какой Python используется в командной строке, Rscript -e "print(Sys.which("python"))" и RStudio, Sys.which("python") . Явно определите, какой Python.exe для запуска с помощью reticulate use_python("/path/to/python") .


  1. Несколько Rs

    У вас есть несколько версий 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" .


  1. Несколько сеток

    У вас есть несколько 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 «). Ошибка новичка! Еще раз спасибо за подробное устранение неполадок, хотя, когда у меня возникает реальная проблема 🙂