【问题标题】:Calling R script using subprocess command but Library() command in r script prevents it from running使用 subprocess 命令调用 R 脚本,但 r 脚本中的 Library() 命令阻止它运行
【发布时间】:2016-09-05 21:09:18
【问题描述】:

我创建了一个 R 脚本,我需要从 Python 调用 R 脚本。 R 脚本需要一些包才能运行,但是每当我运行我的 python 代码时,我都会收到以下错误:

CalledProcessError: Command '['C:/Program Files/R/R-3.2.3/bin/x64/Rscript.exe', 'D:/Abhi/desktop/testing/SCRIPTS/JMOTIF/data-04-13/NewClassificationMethod.R', '51', '9', '20', '20', 'D://Abhi//desktop//testing//SCRIPTS//JMOTIF//data-04-13//PureAgri.csv', 'D://Abhi//desktop//testing//SCRIPTS//JMOTIF//data-04-13//PureForest.csv']' returned non-zero exit status 1

如果我注释掉库调用,则不会出现错误并且脚本可以正常工作。

作为一个小例子,以下代码将不起作用:

pythonArgs = commandArgs(trailingOnly = TRUE)
library(plyr)
wSize=  as.numeric(pythonArgs[1]) #as.numeric(pythonArgs[1])#Window Size
paaSize=as.numeric(pythonArgs[2])#Pax approximation size 
cat(wSize, paaSize)

此代码将起作用

pythonArgs = commandArgs(trailingOnly = TRUE)
#library(plyr)
wSize=  as.numeric(pythonArgs[1]) #as.numeric(pythonArgs[1])#Window Size
paaSize=as.numeric(pythonArgs[2])#Pax approximation size 
cat(wSize, paaSize)

以下是我目前从 Python 调用它的方式:

cmd = [command, path2Script] + args
x = subprocess.check_output(cmd,universal_newlines = True)

【问题讨论】:

  • 只是出于好奇,如果您使用 require(plyr) 而不是库会发生什么?
  • 由于没有错误消息只生成 False 值,因此脚本将一直运行,直到我需要使用库,当我检查 require(plyr) 的值时,它说它返回了 FALSE 值。
  • 所有软件包都会出现这种情况吗?你能用tryCatch检查错误的性质吗?
  • 是的,我尝试加载的任何包(三个包)都会发生这种情况。我不熟悉 tryCatch 函数,除了我在问题中发布的错误之外,它会提供任何详细信息吗?
  • 从 R 控制台读取?Startup,然后设置缺少的相应系统环境变量。您的 R 进程未找到正确的库位置。如果您想查看当前“查找”的位置,请在您的脚本中包含 print(.libPaths()) 并从 R 控制台会话中执行此操作。我预测它们会有所不同。

标签: python r subprocess environment-variables packages


【解决方案1】:

考虑使用 Python 的子进程 Popen 有条件地捕获子进程的输出或错误,这里是 R 脚本。

from subprocess import Popen, PIPE

cmd = [command, path2Script] + args
p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)            
output, error = p.communicate()

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

如果您运行POpen,则会在 Python 控制台中直接生成一条信息更丰富的错误消息,提醒您包路径情况。

R ERROR:
 b"Error in library(plyr) : there is no package called 'plyr'\r\nExecution halted\r\n"

【讨论】:

  • 如果我这样做,那么它只会返回无。而 subprocess 命令正在提供 R 控制台吐出的所有内容。不过,它确实对错误处理有很大帮助。知道为什么它返回 None 吗?即使在 R 中我只是尝试发回整数 10
猜你喜欢
  • 2015-09-20
  • 2018-10-05
  • 2013-06-24
  • 2018-03-04
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多