Вопрос

Я пытаюсь создать дерево с файлом Fasta и выравнивание с Musclecommandline

import sys,os, subprocess
from Bio import AlignIO
from Bio.Align.Applications import MuscleCommandline
cline = MuscleCommandline(input="c:\Python26\opuntia.fasta")
child= subprocess.Popen(str(cline),
                         stdout = subprocess.PIPE,
                         stderr=subprocess.PIPE,
                        shell=(sys.platform!="win32"))
align=AlignIO.read(child.stdout,"fasta")
outfile=open('c:\Python26\opuntia.phy','w')
AlignIO.write([align],outfile,'phylip')
outfile.close()

Я всегда сталкиваюсь с этими проблемами

Traceback (most recent call last):
  File "<string>", line 244, in run_nodebug
  File "C:\Python26\muscleIO.py", line 11, in <module>
    align=AlignIO.read(child.stdout,"fasta")
  File "C:\Python26\Lib\site-packages\Bio\AlignIO\__init__.py", line 423, in read
    raise ValueError("No records found in handle")
ValueError: No records found in handle
Это было полезно?

Решение

Biopython 1.54 был выпущен сегодня со стабильной версией модуля Bio.phylo. Я обновил документацию с примером трубопровода для генерации деревьев. Для простоты пример использует Clustalw для выравнивания последовательностей и генерировать дерево вместо мышц и таблиц, но большинство кода все еще одинаковы или аналогичны.

http://biopython.org/wiki/phylo#example_Pipeline.

Если вы уже создали дерево с Phylip (используя выравнивание .phy в качестве ввода), вы все равно можете следить за примерами Филло в целом. PHYLIP создает файл Newick с именем, такими как «Outttree» или «Foo.tree».

(Не стесняйтесь объединить это с ответом Брэда; я не могу написать комментарий в этой теме еще.)

Другие советы

Пару вещей дает проблемы здесь:

  1. Вам нужен ребенок .wait () После вызова подпроцесса, чтобы ваш код будет подождать, пока внешняя программа не будет выполнена.

  2. Мышцы на самом деле не пишут в Stdout, даже если документация по справке говорит, что она, по крайней мере, с v3.6, что у меня здесь. Я считаю, что последний - это V3.8, поэтому это может быть исправлено.

Biopython говорит вам, что stdout вы передаете, это пусто, что это ошибка, которую вы видите. Попробуйте запустить командную строку напрямую:

muscle -in opuntia.fasta

и посмотрите, если вы видите вывод Fasta. Вот версия, которая исправляет задачу ожидания и использует промежуточный выходной файл:


import sys,os, subprocess
from Bio import AlignIO
from Bio.Align.Applications import MuscleCommandline
out_file = "opuntia.aln"
cline = MuscleCommandline(input="opuntia.fasta", out=out_file)
child= subprocess.Popen(str(cline),
                         stdout = subprocess.PIPE,
                         stderr=subprocess.PIPE,
                        shell=(sys.platform!="win32"))
child.wait()
with open(out_file) as align_handle:
    align=AlignIO.read(align_handle,"fasta")
outfile=open('opuntia.phy','w')
AlignIO.write([align],outfile,'phylip')
outfile.close()
os.remove(out_file)

Из документации Библиотека субпроцессов:

Предупреждение

Используйте связь (), а не .stdin.write, .stdout.ruad или .stderr.read, чтобы избежать тупиков из-за любого из других буферов OS труб, заполняя и блокируя детский процесс.

Так что, может быть, вы можете попробовать что-то вроде:

mydata = child.communicate()[0]

У вас есть незащищенная обратная косая черта в вашем текущем имени файла, которое никогда не бывает хорошо.

Используйте «R», чтобы получить сырые строки, то есть r'c:\Python26\opuntia.phy'.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top