我想从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类型文件?
提前致谢。
答案 0 :(得分:4)
您抓取的Rscript
调用使用称为i / o重定向的shell功能。特别是,该命令的结束> outputFile.Rout 2>&1
是一个特殊的shell功能,意味着大致将命令的所有输出重定向到文件&#34; outputFile.Rout&#34;,哦,还有重定向标准输出的标准错误,因此它也会在该文件中结束。
shell=False
禁用所有基于shell的功能
换句话说,subprocess.call()
的默认值是在不使用shell的情况下运行命令,因此您无法访问基于shell的功能。相反,&#39;&gt;&#39;和&#39; outputFile.Rout&#39;例如,直接作为args传递给R,就像a
一样。
虽然有几种方法可以解决这个问题,例如使用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)