Frage

Ich versuche Baum mit fasta Datei-Eingabe und Abgleich mit MuscleCommandline zu erzeugen

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()

ich mit diesen Problemen immer begegnen

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
War es hilfreich?

Lösung

biopython 1,54 wurde heute veröffentlicht mit einer stabilen Version des Bio.Phylo Modul. Ich habe die Dokumentation mit einem Beispiel-Pipeline zur Erzeugung Bäume aktualisiert. Der Einfachheit halber wird im Beispiel ClustalW zu align Sequenzen und einen Baum erzeugen, statt Muskel- und Phylip, aber die meisten der Code ist immer noch die gleichen oder ähnliche.

http://biopython.org/wiki/Phylo#Example_pipeline

Wenn Sie bereits einen Baum mit Phylip (unter Verwendung der .phy Ausrichtung als Eingabe) erzeugt haben, können Sie immer noch die Phylo Beispiele im Allgemeinen folgen. Phylip schafft eine Newick Datei mit einem Namen wie "outttree" oder "foo.tree".

(Fühlen Sie sich frei diese Antwort ist mit Brad zu fusionieren;. Ich keinen Kommentar in diesem Thread noch schreiben kann)

Andere Tipps

Ein paar Dinge gibt hier Probleme:

  1. Sie benötigen einen child.wait () nach dem Aufruf subprocess so dass Ihr Code wartet, bis das externe Programm getan ausgeführt wird.

  2. Muskel tatsächlich nicht auf stdout schreiben, auch wenn die Hilfe-Dokumentation sagt ja, zumindest mit v3.6, dass ich hier habe. Ich glaube, die letzte ist v3.8 so dieses Problem behoben werden kann.

biopython sagt Ihnen, dass die stdout Sie es vorbei ist leer, das ist der Fehler, den Sie sehen. Versuchen Sie, die Kommandozeile ausgeführt wird direkt an:

muscle -in opuntia.fasta

und sehen, ob Sie FASTA-Ausgabe. Hier ist eine Version, dass behebt das Warten Problem und verwendet eine Zwischenausgabedatei:


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)

Aus der Dokumentation der subproccess Bibliothek :

  

Warnung

     

Verwenden Sie kommunizieren () statt   .stdin.write, .stdout.read oder   .stderr.read Deadlocks zu vermeiden, aufgrund   keines der anderen OS Rohrpuffer   Auffüllen und das Kind blockiert   Prozess.

Vielleicht könnten Sie versuchen, so etwas wie:

mydata = child.communicate()[0]

Sie haben einen ungeschützten Backslash in Ihrer Ausgabe-Dateinamen, die nie gut ist.

Mit 'r' rohen Strings zu erhalten, das heißt r'c:\Python26\opuntia.phy'.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top