通过 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而不是'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 通过管道连接多个进程?