从python运行脚本时的R输出

R output when script is run form python

我想从python运行一个r脚本,并将输出捕获到一个.rout类型的文件中。R脚本接受命令行参数。我在挣扎…下面是最小工作示例。

R脚本:

1
2
3
4
5
6
7
8
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脚本:

1
2
3
4
5
6
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脚本的最后一行是通过stackoverflow链接。

如果运行python脚本,则不会生成"outputfile.rout"。但是,python输出包括:

1
2
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时,就会生成输出文件。请注意,我已经尝试指定输出文件等的完整路径。

有人能解释一下i)这里发生了什么;ii)我如何从python运行r脚本,让r脚本接受命令行参数并生成rout类型的文件?

事先谢谢。


i)这里发生了什么

您获取的Rscript调用使用了一个称为I/O重定向的shell功能。特别是,该命令的结尾,> outputFile.Rout 2>&1是一个特殊的shell特性,它意味着将命令的所有输出大致重定向到文件"output file.rout",噢,还将标准错误重定向到标准输出,因此最终也会出现在该文件中。

subprocess文件,

shell=False disables all shell based features

换句话说,subprocess.call()的默认设置是在不使用shell的情况下运行命令,因此您无法访问基于shell的功能。例如,'>'和'outputfile.rout'直接作为args传递给r,就像a一样。

ii)使用输出重定向运行r脚本

虽然有两种方法可以做到这一点,例如使用os.system()或将shell=True传递给subprocess.call()并将命令作为字符串传递,但建议的方法只是使用subprocess中的机器来执行等效的I/O重定向:

1
2
3
4
5
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)