Используйте сетку для вызова скрипта Python и отправки электронной почты - PullRequest
0 голосов
/ 09 апреля 2019

Я использую планировщик заданий 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 Ответ

2 голосов
/ 09 апреля 2019

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

Это работает правильно, когда я запускаю его построчно из RStudio. Проблема в том, что он не работает, когда скрипт выполняется по расписанию

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

  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").


  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

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

...