2015-07-20 120 views
-1

新手问题在这里;管道破坏返回

我有以下两个函数 - 第一个,'read_fq_entry',从subprocess.Popen(该系统调用zcat并管道它)读取行,并一次返回四行作为列表。

第二个'stream_fq'从第一个获取返回的输出,并且暂时打印它。 (最终我将被随机抽样套系,并将其写入文件

的问题是,在第一个函数的返回打破了管道 - 如何不做到这一点任何想法??

def read_fq_entry(process): 

     while (True): 
      name = process.stdout.readline()  
      seq = process.stdout.readline() 
      strand = process.stdout.readline() 
      qual = process.stdout.readline() 

      if (not name or name == '') : 
       return [] 

      return [name, seq, strand, qual] 


def stream_fq(infile1, infile2, Nr_of_reads): 


     proc1 = subprocess.Popen("zcat " + infile1, stdout=subprocess.PIPE, shell=True) 
     proc2 = subprocess.Popen("zcat " + infile2, stdout=subprocess.PIPE, shell=True) 

     while (True): 

      fq_1_entry = read_fq_entry(proc1) 
      fq_2_entry = read_fq_entry(proc2) 
      print fq_1_entry 
      print fq_2_entry 
+1

这可能是不相关的职业blem,但'not name or name =='''是多余的,因为当'name'是空字符串时'not name'的值为True。将它缩短为“if not name:”会有相同的效果。 – Kevin

+0

谢谢Kevin - 好的提示 – user3234810

+0

把'''stream_fq''写成[coroutine](http://wla.berkeley.edu/~cs61a/fa11/lectures/streams.html#coroutines)和''send' ''线路。如果我在我的办公桌上,我会用一个例子回答,希望这会让你走。 – wwii

回答

1

线return [name, seq, strand, qual]while True:循环中,你应该把它移到一个级别,也许改变return声明为yield语句。

+0

这没有帮助。 OP想要一个发生器,但这是一个重大改写。 – Kevin

+0

定义生成器 - 可根据需要重写,寻找最佳解决方案。 – user3234810