从Python调用并执行r脚本

从Python调用并执行r脚本,python,r,subprocess,Python,R,Subprocess,我正在尝试使用这个Python脚本调用一个r脚本并运行它。r脚本是dbc2cv.r,其代码位于Python块下面。 我设法调用了r脚本并打开了r studio,但是代码并没有像我希望的那样自动运行。我的感觉是子流程.call行中有错误,但我不知道是什么 import subprocess import os os.chdir("path") def dbc2csv(raw_filename): dbc2csv_path = "Code\\R\\dbc2

我正在尝试使用这个Python脚本调用一个r脚本并运行它。r脚本是dbc2cv.r,其代码位于Python块下面。 我设法调用了r脚本并打开了r studio,但是代码并没有像我希望的那样自动运行。我的感觉是
子流程.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)
#install.packages(“read.dbc”)您需要此软件包
图书馆(“read.dbc”)

dbc2dbf不应通过Rstudio调用R脚本,而应使用Rscript。这是R附带的命令行程序,专门用于此目的


如果将结果写入CSV文件,我不会将其硬编码到R脚本中,而是将文件名作为命令行参数传递给脚本(可以通过commandArgs在R脚本中获得)。然后,您可以将文件存储在临时目录中,例如,使用python模块tempfile创建的目录。

类似于可以使用python.exe在命令行自动运行的python.py脚本,R脚本可以使用
Rscript.exe
(R安装目录的bin文件夹中的可执行文件)运行。这将在后台进程中运行R代码,而不需要像RStudio这样的IDE。(记住,就像任何编程语言一样,您可以在简单的文本编辑器中编写R代码,而无需任何IDE)

下面使用了更有用的方法来捕获子进程的输出和错误,并更改子进程中的工作目录。另外,您可以在列表中传递参数,而不是以空格分隔的字符串。请记住,子进程中的错误不会引发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
   

不是很有用-如果它在RStudio中运行,为什么不在RScript中运行呢?另外,OP正在尝试从Python运行,而不是从控制台运行@shtala:OP通过子进程运行它,这允许stdin/stdout重定向。由于文件名显然在Windows操作系统上,因此您需要一个命令行程序来使用匿名管道,这在Rstudio中根本不起作用。此外,这个问题涉及的是从Python运行一个R scirpt,而不是以交互方式运行,这正是Rscript的用例。