Question

Je suis en train de générer des arbres avec l'entrée de fichier FASTA et l'alignement avec 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()

Je rencontre toujours avec ces problèmes

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
Était-ce utile?

La solution

Biopython 1,54 a été publié aujourd'hui une version stable du module Bio.Phylo. J'ai mis à jour la documentation avec un pipeline exemple pour les arbres de production. Par souci de simplicité, l'exemple utilise ClustalW à des séquences d'alignement et de générer un arbre, au lieu de Muscle et Phylip, mais la plupart du code est toujours identique ou similaire.

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

Si vous avez déjà généré un arbre avec Phylip (en utilisant l'alignement .phy en entrée), vous pouvez toujours suivre les exemples phylo en général. Phylip crée un fichier Newick avec un nom comme "outttree" ou "foo.tree".

(Ne hésitez pas à fusionner cela avec la réponse de Brad,. Je ne peux pas écrire un commentaire dans ce thread encore)

Autres conseils

Un couple de choses sont donne des problèmes ici:

  1. Vous avez besoin d'un child.wait () après l'appel subprocess afin que votre code attendra jusqu'à ce que le programme externe se fait en cours d'exécution.

  2. Muscle n'écrit pas vraiment à stdout, même si la documentation d'aide dit qu'il fait, au moins avec v3.6 que j'ai ici. Je crois que le dernier est donc ce v3.8 peut être fixé.

Biopython vous dit que le stdout vous passez il est vide, ce qui est l'erreur que vous voyez. Essayez d'exécuter directement la ligne de commande:

muscle -in opuntia.fasta

et voyez si vous voyez la sortie FASTA. Voici une version qui résout le problème d'attente et utilise un fichier de sortie intermédiaire:


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)

De la documentation du bibliothèque subproccess :

  

Avertissement

     

Utilisation communiquer () plutôt que   .stdin.write, ou .stdout.read   .stderr.read pour éviter les blocages dus à   l'un des autres tampons de tuyauterie du système d'exploitation   le remplissage et le blocage de l'enfant   processus.

donc vous pourriez peut-être essayer quelque chose comme:

mydata = child.communicate()[0]

Vous avez une barre oblique inverse non protégé dans votre fichier de sortie, qui est jamais bon.

Utilisez 'r' pour obtenir des chaînes premières, à savoir r'c:\Python26\opuntia.phy'.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top