Здесь есть несколько проблем:
Вам нужен child.wait () после вызова подпроцесса, чтобы ваш код ожидал завершения работы внешней программы.
Muscle на самом деле не пишет в stdout, хотя справочная документация говорит, что это так, по крайней мере с v3.6, что у меня здесь. Я считаю, что последняя версия v3.8, так что это может быть исправлено.
Biopython сообщает вам, что стандартный проход, который вы передаете, пуст, что является ошибкой, которую вы видите. Попробуйте запустить командную строку напрямую:
<code>muscle -in opuntia.fasta
и посмотрите, видите ли вы вывод FASTA. Вот версия, которая устраняет проблему ожидания и использует промежуточный выходной файл:
<code>
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)