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

|| 当我在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)
但是此方法不提供“ 2”功能。 因此,我想使用
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而没有执行我的脚本。     
已邀请:
        代替\'R \',给它提供Rscript的路径。我有同样的问题。打开R,但不执行我的脚本。您需要调用Rscript(而不是R)来实际执行脚本。
retcode = subprocess.call(\"/Pathto/Rscript --vanilla /Pathto/test.R\", shell=True)
这对我有用。 干杯!     
        我已经通过将所有内容放在方括号中解决了这个问题。
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()
    
        您实际上并没有完全执行它^^尝试以下操作
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
    
        一些想法: 您可能需要考虑使用
Rscript
前端 运行脚本更容易;您可以直接传递脚本文件名 作为参数,并且不需要通过标准输入读取脚本。 您不需要仅将标准输出重定向到文件的外壳,就可以 直接用
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()
    
        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
参考:通过Rscript或此链接将R用作脚本语言     

要回复问题请先登录注册