Выполнение R-скрипта в Python через подпроцесс. Открыть - PullRequest
3 голосов
/ 22 июня 2011

Когда я выполняю скрипт в 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 ]

4 голосов
/ 19 июля 2012

Вместо 'R' укажите путь к Rscript.У меня такая же проблема.Открывает R, но не выполняет мой скрипт.Вам нужно вызвать Rscript (вместо R), чтобы фактически выполнить скрипт.

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

Это работает для меня.

Приветствия!

1 голос
/ 06 июля 2011

Я решил эту проблему, поместив все в скобки ..

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()
0 голосов
/ 15 сентября 2016

Решение Кевена подходит для моих требований.Просто чтобы привести еще один пример решения @ Kevin.Вы можете передать больше параметров в rscript с помощью строки в стиле python:

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 или по этой ссылке

0 голосов
/ 31 июля 2011

Пара идей:

  1. Возможно, вы захотите использовать внешний интерфейс Rscript, который делает запуск скриптов проще; Вы можете передать имя файла сценария напрямую в качестве параметра, и не нужно читать сценарий через стандартный ввод.
  2. Вам не нужна оболочка для простого перенаправления стандартного вывода в файл, вы можете сделать это напрямую с 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()
0 голосов
/ 22 июня 2011

Вы никогда не выполняете его полностью ^^ попробуйте следующее

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
...