如何将python脚本的输出传输到Rscript?

时间:2014-05-27 21:40:13

标签: python linux r bash pipe

我正在编写一个bash脚本,它使用命令行输入中的参数传递给python脚本,结果是使用python的csv.writer模块生成.csv文件。然后我写了一个R脚本,它自己接受一个.csv文件,但我现在想把csv文件从我的python脚本直接传送到我的r脚本。

这是我的bash脚本:

#!/bin/bash

python protparams.py $1 | Rscript frequency.r

和我的python脚本:

from Bio import SeqIO
from Bio.SeqUtils import ProtParam
from Bio.SeqUtils import ProtParamData
import sys
import csv

handle = open(sys.argv[1])
with open('test.csv', 'w') as fp: 
    writer = csv.writer(fp, delimiter=',')
    for record in SeqIO.parse(handle, "fasta"): 
            seq = str(record.seq)
            X = ProtParam.ProteinAnalysis(seq)
            data = [seq,X.get_amino_acids_percent(),X.aromaticity(),X.gravy(),X.isoelectric_point(),X.secondary_structure_fraction(),X.molecular_weight(),X.instability_index()]
            writer.writerow(data)

这一切都可以正常工作我的python脚本在通过我的bash脚本调用时会生成csv文件。大!但是当我将它传输到我的bash文件中的以下R脚本时,我收到此错误:

Error in file(file, "rt") : cannot open the connection
Calls: read.csv -> read.table -> file
In addition: Warning message:
In file(file, "rt") : cannot open file 'NA': No such file or directory
Execution halted

这是我的R脚本供参考:

args <- commandArgs(trailingOnly = TRUE)
dat <- read.csv(args[1], header=TRUE)
write.csv(dat, file = "out2.csv")

(目前我的r脚本只是测试它是否可以输出.csv文件)。

此消息通常在文件不存在时发生,但在这种情况下我认为它出现是因为我的r脚本中的参数期望一个文件作为命令行参数传递 - 这只是没有被提取以当前的方式,我写了我的bash脚本。我认为管道我的python程序的输出与将输出用作我的r脚本的命令行参数相同是错误的吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

是的,frequency.R(从stdin读取)稍有变化,可以复制.csv

l@np350v5c:~$ cat foo.sh 
cat gbr_Country_en_csv_v2.csv | Rscript frequency.R

l@np350v5c:~$ cat frequency.R 
f <- file("stdin")
dat <- read.csv(f, header=TRUE)
write.csv(dat, file = "out2.csv")