У меня есть сервер WAMP 3.1.3, на котором запущена главная страница HTML, которая принимает вводные данные «дата начала», «конец» и «организация». Кнопка отправки затем передает информацию следующему php-скрипту:
<?php
$from = strtotime($_POST["fromdate"]);
$to = strtotime($_POST["todate"]);
$org = $_POST["org"];
$python = "C:\Python27\python.exe ";
$pyscript = "C:\wamp64\www\DMARC\Sample_Reports\GetOutlookAttachments.py $from $to $org";
echo $python, $pyscript;
chdir("C:\wamp64\www\DMARC\Sample_Reports");
exec("$python $pyscript");
?>
Сценарий получает данные, преобразует их в соответствующий формат и передает их в сценарий Python 2.7. Данные, которые получает скрипт python, используются для фильтрации некоторых журналов. Как только журналы отфильтрованы, скрипт Python вызывает скрипт R-markdown для создания отчета в формате HTML. Код Python, который вызывает скрипт rmarkdown:
cmd = '"C:/PROGRA~1/R/R-3.5.1/bin/x64/Rscript.exe -e \"Sys.setenv(RSTUDIO_PANDOC=\'C:/Program Files (x86)/Pandoc\'); rmarkdown::render(\'../Filter\ Tool/report.Rmd\')\""'
os.system(cmd)
Раньше я запускал скрипт python из cmd, предоставляя ему необходимые аргументы, и все работало нормально. Фильтрация, выполненная python, была правильной, rmarkdown анализировал логи и генерировал HTML-отчеты. Теперь, когда я пытаюсь запустить его из вызова PHP, я постоянно получаю следующее в apache_error.log:
Error in loadNamespace(name): there is no package called 'rmarkdown'
Я удостоверился, что R использует правильные пути для библиотек, указал путь в верхней части скрипта rmarkdown. Я убедился, что то, что входит в exec (), работает, вставляя его значение в cmd, и оно работает. Что-нибудь еще я могу попробовать?
РЕДАКТИРОВАТЬ:
В соответствии с запросом здесь находится верхняя часть скрипта уценки:
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r include=FALSE}
library(XML)
library(methods)
library(readbulk)
library(zoo)
library(tidyr)
library(stringr)
library(data.table)
library(ggplot2)
library(plyr)
library(plotly)
library(IPtoCountry)
library(rworldmap)
library(knitr)
library(rmarkdown)
.libPaths(c("C:/Users/username/Documents/R/win-library/3.5", "C:/Program Files/R/R-3.5.1/library"))
```
Так как rmarkdown
не входит в число пакетов по умолчанию, загружаемых с каждым сеансом R, таких как utils
, base
, а также stats
нужно позвонить library(rmarkdown)
строка в вашем вызове команды Python, который выполняется вне ваш R скрипт
Рассмотрим также использование Python subprocss.Popen
, лучший обработчик для вызовов командной строки, чтобы даже захватить консоль и вывод ошибок с лучшей обработкой кавычек (и даже добавить Rscript
в PATH
переменная окружения и избегайте указания полного каталога для исполняемого файла).
from subprocess import Popen, PIPE
# COMMAND WITH THREE ARGUMENTS
cmd = ["C:/PROGRA~1/R/R-3.5.1/bin/x64/Rscript.exe", "-e",
"Sys.setenv(RSTUDIO_PANDOC='C:/Program Files (x86)/Pandoc'); library(rmarkdown); rmarkdown::render('../Filter Tool/report.Rmd')"
p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output, error = p.communicate()
if p.returncode == 0:
print('R OUTPUT:\n {0}'.format(output))
else:
print('R ERROR:\n {0}'.format(error))
Я чувствую себя идиотом. Решение было разместить .libPaths(c("C:/Users/username/Documents/R/win-library/3.5", "C:/Program Files/R/R-3.5.1/library"))
в верхней части скрипта уценки перед загрузкой всех библиотек, чтобы указать, откуда их загружать. Я помещал это внизу.