从Python调用和执行R脚本

4

我正在尝试使用这个Python脚本来调用一个r脚本并运行它。r脚本是dbc2csv.r,其代码位于Python块下方。 我设法调用了r脚本,并打开了R Studio,但代码不会像我希望的那样自动运行。我的感觉是subprocess.call行有问题,但我想不出原因。

import subprocess
import os

os.chdir("path")


def dbc2csv(raw_filename):
    dbc2csv_path = "Code\\R\\dbc2csv.R " + "Data\\CNES\\2005" + " " + "Data\\CNES\\2005"  + " " + raw_filename

    try:
        r_script_path = subprocess.getoutput('Code\\R\\dbc2csv.r')
        subprocess.call([r_script_path, "--vanilla", dbc2csv_path])
        return True
    except:
        print("dbc2csv - Error converting file: " + raw_filename)

        return False
 
dbc2csv("Data\\CNES\\STAC0508.dbc")

这是我尝试调用和执行的R脚本。

#install.packages("read.dbc") You need this package
library("read.dbc")


dbc2dbf <- function(rawDir, convertedDir, file) {
  # reads dbc file
  x <- read.dbc(paste(rawDir, file, sep=""))
  # write it to csv
  write.csv(x, file=paste(convertedDir, file, ".csv", sep=""))
}

args = commandArgs(trailingOnly=TRUE)
try(dbc2dbf(args[1], args[2], args[3]), TRUE)
2个回答

5
与Python的.py脚本类似,可以使用R脚本来自动运行 Rscript.exe (安装目录下bin文件夹中的可执行文件)来在后台进程中运行R代码,无需像RStudio这样的IDE(请记住,像任何编程语言一样,您可以在简单的文本编辑器中编写R代码而不需要任何IDE)。
下面使用subprocess.Popen,它更有用以捕获子进程的输出和错误,并更改子进程的工作目录。此外,你需要将args作为列表传递,而不是作为空格分隔的字符串。请注意,子进程中的错误将不会引发Python异常。
def dbc2csv(raw_filename):
   command = 'C:/Path/To/bin/Rscript.exe' 
   # command = 'Rscript'                    # OR WITH bin FOLDER IN PATH ENV VAR 
   arg = '--vanilla' 

   try: 
     p = subprocess.Popen([command, arg,
                          "Code/R/dbc2csv.R",
                          "Data/CNES/2005", 
                          "Data/CNES/2005",   
                          raw_filename],
                          cwd = os.getcwd(),
                          stdin = subprocess.PIPE, 
                          stdout = subprocess.PIPE, 
                          stderr = subprocess.PIPE) 

     output, error = p.communicate() 

     if p.returncode == 0: 
        print('R OUTPUT:\n {0}'.format(output.decode("utf-8"))) 
     else: 
        print('R ERROR:\n {0}'.format(error.decode("utf-8"))) 

     return True

   except Exception as e: 
     print("dbc2csv - Error converting file: " + raw_filename) 
     print(e)

     return False
   

2
你不应该通过Rstudio调用R脚本,而是使用。这是一个随R一起提供的命令行程序,专门为此目的提供。
如果你将结果写入CSV文件中,我建议你不要在R脚本中硬编码它,而是将文件名作为命令行参数传递给脚本(可以在R脚本中使用获取)。然后你可以将文件存储在临时目录中,例如使用Python模块创建的目录。

并不是很有帮助 - 如果它可以在RStudio中运行,为什么不能在RScript中运行呢?此外,OP试图从Python而不是控制台运行! - Sebastian Hätälä
1
@shtala:OP通过subprocess运行它,这允许stdin/stdout重定向。由于文件名显然在Windows操作系统上,因此需要使用命令行程序来使用匿名管道,而这在Rstudio中根本行不通。此外,问题是关于从Python而不是交互式地运行R脚本,这正是使用Rscript的用例。 - cdalitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接