我有一个运行HTML主页的WAMP服务器3.1.3,该主页接受“开始”日期,“结束”日期和“组织”文本输入。然后,提交按钮会将信息传递给以下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报告。调用rmarkdown脚本的Python代码:
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)
之前,我曾经从cmd运行python脚本,为其提供所需的参数,并且一切正常。 python所做的过滤是正确的,rmarkdown分析了日志并生成了HTML报告。现在,我尝试通过PHP调用运行它,我不断在apache_error.log中得到以下信息:
Error in loadNamespace(name): there is no package called 'rmarkdown'
在rmarkdown脚本顶部,我已确保R使用正确的库路径。我通过将其值粘贴到cmd中并运行来确保exec()的工作正常。我还能尝试什么吗?
编辑:
以下是Markdown脚本的顶部请求:
```{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"))
```
答案 0 :(得分:1)
由于rmarkdown
不在每个R会话加载的默认软件包中,例如utils
,base
和stats
,因此您需要致电library(rmarkdown)
在您的R脚本 outside 中运行的Python命令调用中的第一行。
还考虑使用Python的subprocss.Popen
(一种更好的命令行调用处理程序),甚至通过更好的引号处理捕获控制台和错误输出(甚至将Rscript
添加到PATH
environment variable并避免指定可执行文件的完整目录)。
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))
答案 1 :(得分:0)
我觉得自己是个白痴。解决方案是在加载所有库之前将.libPaths(c("C:/Users/username/Documents/R/win-library/3.5", "C:/Program Files/R/R-3.5.1/library"))
放在markdown脚本的顶部,以指示从何处加载它们。我将其放在底部。