通过subprocess.Popen在python中执行R脚本

时间:2011-06-22 03:26:18

标签: python r subprocess os.system

当我在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但没有执行我的脚本。

5 个答案:

答案 0 :(得分:4)

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

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

这适合我。

干杯!

答案 1 :(得分:1)

我通过将所有内容放入括号中解决了这个问题..

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()

答案 2 :(得分:0)

你永远不会完全执行它^^尝试以下

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

答案 3 :(得分:0)

一些想法:

  1. 您可能需要考虑使用Rscript前端 running scripts更容易;你可以直接传递脚本文件名 作为参数,不需要通过标准输入读取脚本。
  2. 您不需要shell只是将标准输出重定向到文件,您可以 直接使用subprocess.Popen
  3. 执行此操作

    示例:

    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 :(得分:0)

Keven的解决方案适合我的要求。仅举几个关于@Kevin&#39的解决方案的例子。您可以使用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