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

时间:2016-04-05 16:00:29

标签: r linux windows shiny

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

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

我在窗户上。当我使用shell代替system时,它就像魅力一样。但是,我正在设计一个将在Linux环境中部署的Shiny应用程序(shinyapps.io)。这就是我需要使用system

的原因

修改

在Windows上,它与建议heresystem(paste("cmd.exe /c", "script.exe object"), intern = FALSE, wait = TRUE)一起使用。但不是在我部署应用程序时(在Linux上)。

HINT

在Windows上本地,如果我将system替换为system2system2(paste("cmd.exe /c", "script.exe object"), wait = TRUE),则会引发status 127警告,输出与我的完全相同在Linux上部署应用程序

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

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

2 个答案:

答案 0 :(得分:1)

只需添加\"就可以解决您的问题,例如

> 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/B C/d 123.dta"。以下是一些更新评论:

  1. system(shQuote(paste0(getwd(),"/Hi 2.exe")))更方便。
  2. 至少在R 3.2.4中,system()的手册建议使用system2()来避免Win / Linux / OSX /下的路径问题。
  3. 更新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] roup,[o / 8] thers的可执行权限,可以更改它以满足要求。

答案 1 :(得分:1)

问题实际上源于.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