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

Я использую планировщик заданий 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!
"""
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 215
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эта проблема с исполнением

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

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

  1. Multiple Pythons

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


  1. Multiple Rs

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


  1. Multiple Reticulates

    У вас есть несколько пакетов reticulate, установленных в одной и той же версии R, находящихся в разных местах библиотеки, каждый из которых вызывает свою версию Python. Сверьтесь с матрицей: installed.package(), найдя reticulate строку. Явный вызов library(reticulate, lib.loc = "/path/to/specific/library").

Спасибо, Парфе! Я попробую все эти решения и сообщу, что работает. PS Увидимся на следующем CRUG или ChiPy.

JeremyB 09.04.2019 22:48

Ха-ха! Рад помочь, товарищ чикагец!

Parfait 10.04.2019 00:18

Оказывается, мне просто нужно было использовать абсолютный путь к файлу скрипта python: source_python("C:/My_Folders/.../setup_smtp.py"). Ошибка новичка! Еще раз спасибо за подробное устранение неполадок, когда у меня есть НАСТОЯЩАЯ проблема :)

JeremyB 10.04.2019 18:23

Другие вопросы по теме