在python上错误地打印bash输出

时间:2018-02-05 19:36:44

标签: python bash

我尝试使用python程序从bash自动化某些进程(对于RNA-seq),第一步是从* .fastq传递文件,如下所示

Demo_T3_L001_R1.fastq  Demo_T3_L002_R1.fastq  Demo_T3_L003_R1.fastq  Demo_T3_L004_R1.fastq
Demo_T3_L001_R2.fastq  Demo_T3_L002_R2.fastq  Demo_T3_L003_R2.fastq  Demo_T3_L004_R2.fastq

(文件的内容与我的问题无关,但我可以根据需要复制它们)

到* .fasta,像这样:

Demo_T3_L001_R1.fasta  Demo_T3_L002_R1.fasta  Demo_T3_L003_R1.fasta  Demo_T3_L004_R1.fasta
Demo_T3_L001_R2.fasta  Demo_T3_L002_R2.fasta  Demo_T3_L003_R2.fasta  Demo_T3_L004_R2.fasta

我有这个脚本:

import sys
import os
from os import listdir
from  os.path import isfile, join
import subprocess
from subprocess import call

mypath = '/home/Python_test'
## Read only *.fastq files ##
onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f)) if 
f.endswith('.fastq')]
print("There are:", len(onlyfiles), "files.")
## Loop between the files found ##
for num in range (0,len(onlyfiles)):
    ## Command to do ##
    cmd_input = ('sed','-n','1~4s/^@/>/p;2~4p',onlyfiles[num])
    ## Create names for otput files ##
    cmd_output = onlyfiles[num].replace('fastq','fasta')
    ## Open file ##
    sys.stdout = open(cmd_output, 'w')
    ## Print in file ##
    print(call(cmd_input))

但我的问题是打印出现在终端上,所有文件只有一个' 0'运行脚本后,像这样

>>head *.fasta

==> Demo_T3_L001_R1.fasta <==
0

==> Demo_T3_L001_R2.fasta <==
0

==> Demo_T3_L002_R1.fasta <==
0

==> Demo_T3_L002_R2.fasta <==
0

==> Demo_T3_L003_R1.fasta <==
0

==> Demo_T3_L003_R2.fasta <==
0

==> Demo_T3_L004_R1.fasta <==
0

==> Demo_T3_L004_R2.fasta <==
0

我尝试过:

subprocess.Popen(cmd_input, stdout = cmd_output)

和subprocess.call,但都有错误:&#39; str&#39;对象没有属性&#39; fileno&#39;。

所以我问如何在相应的文件中正确写出输出,因为我无法弄明白。 我认为打印错误是因为呼叫在终端中发生并且打印没有明确的输入,因此假定为“0”。作为输出,它写入文件,但它只是一个假设。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

来自subprocess.call的文档:

  

运行args描述的命令。等待命令完成,然后返回returncode属性。

来自subprocess.check_output的文档:

  

使用参数运行命令并将其输出作为字节字符串返回。

返回代码为0(成功),以便您打印的内容。如果你想获得命令的输出,请使用另一个函数。