Подпрокат не поймает стандартный выход
-
27-09-2019 - |
Вопрос
Я пытаюсь создать дерево с файлом 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».
(Не стесняйтесь объединить это с ответом Брэда; я не могу написать комментарий в этой теме еще.)
Другие советы
Пару вещей дает проблемы здесь:
Вам нужен ребенок .wait () После вызова подпроцесса, чтобы ваш код будет подождать, пока внешняя программа не будет выполнена.
Мышцы на самом деле не пишут в 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'
.