从python运行脚本时的R输出

时间:2015-08-30 09:17:00

标签: python r

我想从python运行R脚本,并将输出捕获到.Rout类型文件中。 R脚本采用命令行参数。我正在努力......最小的工作示例如下。

R脚本:

job_reference <- commandArgs(trailingOnly = TRUE)
arg1 <- job_reference[1]
arg2 <- job_reference[2]
arg3 <- job_reference[3]
arg4 <- job_reference[4]
print("***")
print(paste(arg1, arg2, arg3, arg4))
print("***")

python脚本:

import subprocess
arg1 = 'a'
arg2 = 'b'
arg3 = 'c'
arg4 = 'd'
subprocess.call(["/usr/bin/Rscript",  "--no-save", "--no-restore", "--verbose", "print_letters.R",  arg1, arg2,  arg3, arg4, ">", "outputFile.Rout", "2>&1"])

python脚本中的最后一行是this stackoverflow link

如果我运行python脚本,则“outputFile.Rout”生成。但是python输出包括:

running
'/usr/lib/R/bin/R --slave --no-restore --no-save --no-restore --file=print_letters.R --args a b c d > outputFile.Rout'

当我从命令行运行它而不涉及python时,输出文件生成的。请注意,我已尝试指定输出文件的完整路径等。

任何人都可以解释一下这里发生了什么; ii)我如何从python运行R脚本,R脚本接受命令行参数生成Rout类型文件?

提前致谢。

1 个答案:

答案 0 :(得分:4)

i)这里发生了什么

您抓取的Rscript调用使用称为i / o重定向的shell功能。特别是,该命令的结束> outputFile.Rout 2>&1是一个特殊的shell功能,意味着大致将命令的所有输出重定向到文件&#34; outputFile.Rout&#34;,哦,还有重定向标准输出的标准错误,因此它也会在该文件中结束

来自subprocess docs

  

shell=False禁用所有基于shell的功能

换句话说,subprocess.call()的默认值是在不使用shell的情况下运行命令,因此您无法访问基于shell的功能。相反,&#39;&gt;&#39;和&#39; outputFile.Rout&#39;例如,直接作为args传递给R,就像a一样。

ii)使用输出重定向

运行R脚本

虽然有几种方法可以解决这个问题,例如使用os.system()或将shell=True传递给subprocess.call()并将命令作为字符串传递,但建议的方法是使用subprocess中的机制进行等效的i / o重定向:

with open('outputFile.Rout','w') as fileobj:
    subprocess.call(["/usr/bin/Rscript",  "--no-save", "--no-restore",
                     "--verbose", "print_letters.R", 
                     arg1, arg2,  arg3, arg4], 
                     stdout=fileobj, stderr=subprocess.STDOUT)