Subprocess nicht die Standardausgabe fangen
-
27-09-2019 - |
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
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:
-
Sie benötigen einen child.wait () nach dem Aufruf subprocess so dass Ihr Code wartet, bis das externe Programm getan ausgeführt wird.
-
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'
.