从Python调用并执行r脚本
我正在尝试使用这个Python脚本调用一个r脚本并运行它。r脚本是dbc2cv.r,其代码位于Python块下面。 我设法调用了r脚本并打开了r studio,但是代码并没有像我希望的那样自动运行。我的感觉是从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
子流程.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的用例。