2015-07-20 3 views
-1

новичок вопрос здесь;Нарушение трубы с возвратом

У меня есть две следующие функции: первая, «read_fq_entry», считывает строки из подпроцесса. 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 == ''' является избыточным, потому что 'not name' оценивается как True, когда' name' является пустой строкой. Сокращение его до '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

Смежные вопросы