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

Posted

技术标签:

【中文标题】通过 subprocess.Popen 在 python 中执行 R 脚本【英文标题】:Executing an R script in python via subprocess.Popen 【发布时间】: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() 函数。 【参考方案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】:

几个想法:

    您可能需要考虑使用Rscript 前端,这使得 running scripts 更简单;您可以直接传递脚本文件名 作为参数,不需要通过标准输入读入脚本。 你不需要 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 Rscript 或 this link

【讨论】:

以上是关于通过 subprocess.Popen 在 python 中执行 R 脚本的主要内容,如果未能解决你的问题,请参考以下文章

使用 subprocess.Popen 通过 SSH 或 SCP 发送密码

从 subprocess.Popen 调用“源”命令

将变量传递给 Subprocess.Popen

如何使用 subprocess.Popen 通过管道连接多个进程?

subprocess.wait() 不等待 Popen 进程完成(使用线程时)?

如何从 subprocess.Popen 使用 STDIN [重复]