3

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

4

5 回答 5

4

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

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

这对我有用。

干杯!

于 2012-07-19T19:58:59.760 回答
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()
于 2011-07-06T18:20:11.803 回答
1

几个想法:

  1. 您可能要考虑使用Rscript前端,这使得 运行脚本更容易;您可以直接将脚本文件名作为参数传递,而无需通过标准输入将脚本读入。
  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()
于 2011-07-31T10:38:44.847 回答
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
于 2011-06-22T08:24:14.053 回答
0

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

参考:使用 R 作为脚本语言与 Rscript此链接

于 2016-09-15T11:20:24.897 回答