从R运行.exe:在Linux上的状态127警告不在Windows上

我使用system("script.exe object")从R调用.exe

我得到Warning: running command had status 127 。 我知道这意味着没有find.exe文件。

我在窗户上。 当我使用shell而不是system它就像一个魅力。 不过,我正在devise一个Shiny应用程序,将部署在Linux环境(shinyapps.io)中。 这就是为什么我需要使用system

编辑

Windows上,它可以与system(paste("cmd.exe /c", "script.exe object"), intern = FALSE, wait = TRUE) 。 但不是当我部署应用程序(在Linux上)。

暗示

在Windows本地,如果我用system2system2(paste("cmd.exe /c", "script.exe object"), wait = TRUE)replacesystem ,它会引发status 127警告, 输出和在我的Linux上部署的应用程序

这里很难创build一个可重复的例子,但如果需要,我可以尝试。 请告诉我。

上下文: .exe基本上是一个黑色的框(编译的C ++代码),它将一个.txt文件作为input,并输出另一个.txt文件。 我正在使用R将.txt文件转储到当前工作目录,然后读回.exe文件生成的.txt文件(在存储.exe文件的当前工作目录中创build)。

只要加上\"可以解决你的问题,例如

 > setwd("W:/www/ADemo/") > system(paste0(getwd(),"/Hi 2.exe")) Hello, world. > setwd("W:/www/A Demo/") > system(paste0(getwd(),"/Hi 2.exe")) Warning message: running command 'W:/www/A Demo/Hi 2.exe' had status 127 > system(paste0("\"",getwd(),"/Hi 2.exe","\" ")) Hello, world. 

更新:
当路径中有空格时,通常会看到127错误。 还需要担心应用程序的输入,例如"/path A/A 2" --in-path "/home/A/BC/d 123.dta" 。 这里有一些更新评论:

  1. system(shQuote(paste0(getwd(),"/Hi 2.exe")))要方便得多。
  2. 至少在R 3.2.4中, system()的手册建议使用system2()来避免Win / Linux / OSX /下的路径问题。

更新2:
对于Linux用户,我创建了一个函数来检测工作目录中的给定文件是否可执行。

 chkpermission<-function(file, mode='0777'){ exe_list <- system("echo `ls -l | grep -E ^-.{2}x\\|^-.{5}x\\|^-.{8}x` | awk '{print $9}'", intern=T) if(length(exe_list)==0){ stop("no file is executable"); ##Make sure you know what you are doing here, add a+x permission: ## if (!(file%in%exe_list)) Sys.chmod(file, mode = mode) } return(file%in%exe_list); } 

我已经在GNU awk / grep上测试过了。 2/5/8表示[u / 2] ser,[g / 5] group,[o / 8]这个可执行权限,可以改变它以符合要求。

这个问题实际上源于这样一个事实: .exe文件只能用于Windows的可执行文件。 它不能在Linux环境下开箱即用(你可以使用WINE,但在我的情况下,这是不可能的,因为我从R内调用可执行文件,我没有任何sudo权限或虚拟机上的任何东西我的应用程序的主机)。 所以我编译了我在Linux虚拟机上使用g ++的c ++代码,并使用.out文件而不是.exe

然后在我的R脚本中,我只需要这两个调用:

system("chmod a+x script.out") # to make Linux understand that the file is an executable system("./script.out object") # to run the script