【问题标题】:Executing an R script in python via subprocess.Popen通过 subprocess.Popen 在 python 中执行 R 脚本
【发布时间】:2011-09-20 01:05:10
【问题描述】:

当我在 R 中执行脚本时,它是:

$ R --vanilla --args test_matrix.csv < hierarchical_clustering.R > out.txt

在 Python 中,如果我使用它就可以工作:

process = subprocess.call("R --vanilla --args "+output_filename+"_DM_Instances_R.csv < /home/kevin/AV-labels/Results/R/hierarchical_clustering.R > "+output_filename+"_out.txt", shell=True)

但是这个方法不提供process.wait()函数。

所以,我想用subprocess.Popen,我试过了:

process = subprocess.Popen(['R', '--vanilla', '--args', "\'"+output_filename+"_DM_Instances_R.csv\'",  '<', '/home/kevin/AV-labels/Results/R/hierarchical_clustering.R'])

但它不起作用,Python 只是打开了 R 但没有执行我的脚本。

【问题讨论】:

  • 你试过shell=True吗,即:subprocess.Popen(['R', '--vanilla', '--args', "\'"+output_filename+"_DM_Instances_R.csv\ '", '
  • 它说:致命错误:你必须指定'--save','--no-save'或'--vanilla'但是'--vanilla'在那里......请帮助!!谢谢!!
  • 根据“R --help”,“--args”参数的意思是“跳过命令行的其余部分”。这可能不是你的意思。你有可以向我们展示在 shell 中工作的命令行吗?
  • 我的意思是......当我在 R 中运行我的脚本时,它与 $ R --vanilla --args test_matrix.csv out.txt 一起工作此外,当我使用子进程时.call 在 python 中,它也可以工作......但我需要 subprocess.Popen 以便我可以使用 wait() 函数。

标签: python r subprocess os.system


【解决方案1】:

而不是'R',给它Rscript的路径。我有同样的问题。打开 R 但不执行我的脚本。您需要调用 Rscript(而不是 R)来实际执行脚本。

retcode = subprocess.call("/Pathto/Rscript --vanilla /Pathto/test.R", shell=True)

这对我有用。

干杯!

【讨论】:

    【解决方案2】:

    我已经解决了这个问题,把所有东西都放在括号里..

    process = subprocess.Popen(["R --vanilla --args "+output_filename+"_DM_Instances_R.csv < /home/kevin/AV-labels/Results/R/hierarchical_clustering.R > "+output_filename+"_out.txt"], shell=True)
    process.wait()
    

    【讨论】:

      【解决方案3】:

      几个想法:

      1. 您可能需要考虑使用Rscript 前端,这使得 running scripts 更简单;您可以直接传递脚本文件名 作为参数,不需要通过标准输入读入脚本。
      2. 你不需要 shell 来将标准输出重定向到一个文件,你可以 直接使用subprocess.Popen 进行操作。

      例子:

      import subprocess
      
      output_name = 'something'
      script_filename = 'hierarchical_clustering.R'
      param_filename = '%s_DM_Instances_R.csv' % output_name
      result_filename = '%s_out.txt' % output_name
      with open(result_filename, 'wb') as result:
          process = subprocess.Popen(['Rscript', script_filename, param_filename],
                                     stdout=result);
          process.wait()
      

      【讨论】:

        【解决方案4】:

        你从来没有真正完全执行过它^^试试下面的

        process = subprocess.Popen(['R', '--vanilla', '--args', '\\%s_DM_Instances_R.csv\\' % output_filename, '<', '/home/kevin/AV-labels/Results/R/hierarchical_clustering.R'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 
        process.communicate()#[0] is stdout
        

        【讨论】:

        • 它说:致命错误:你必须指定'--save','--no-save'或'--vanilla'但是'--vanilla'在那里......请帮助!!谢谢!!
        • 我以前从未使用过 R,也不知道参数。
        【解决方案5】:

        Keven 的解决方案可以满足我的要求。再举一个关于@Kevin 解决方案的例子。您可以使用 python 样式的字符串将更多参数传递给 rscript:

        import subprocess
        
        process = subprocess.Popen(["R --vanilla --args %s %d %.2f < /path/to/your/rscript/transformMatrixToSparseMatrix.R" % ("sparse", 11, 0.98) ], shell=True)
        process.wait()
        

        此外,为了使事情更容易,您可以创建一个 R 可执行文件。为此,您只需在脚本的第一行添加:

        #! /usr/bin/Rscript --vanilla --default-packages=utils
        

        参考:Using R as a scripting language with Rscriptthis link

        【讨论】:

          猜你喜欢
          • 2014-01-15
          • 1970-01-01
          • 2011-03-09
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多