Sous-processus ne parvient pas à attraper la sortie standard
-
27-09-2019 - |
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
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:
-
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.
-
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'
.