تفشل العملية الفرعية في التقاط الإخراج القياسي

StackOverflow https://stackoverflow.com/questions/2856697

  •  27-09-2019
  •  | 
  •  

سؤال

أحاول توليد شجرة مع إدخال ملف fasta والمحاذاة مع 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()

أنا دائما واجهت مع هذه المشاكل

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
هل كانت مفيدة؟

المحلول

تم إصدار Biopython 1.54 اليوم مع نسخة مستقرة من وحدة Bio.phylo. لقد قمت بتحديث الوثائق باستخدام خط أنابيب مثال لتوليد الأشجار. بالنسبة للبساطة ، يستخدم المثال Clustalw لمحاذاة التسلسلات وتوليد شجرة ، بدلاً من العضلات والفيروس ، ولكن معظم الكود لا يزال كما هو متماثل.

http://biopython.org/wiki/phylo#example_pipeline

إذا كنت قد قمت بالفعل بإنشاء شجرة مع phylip (باستخدام محاذاة .phy كمدخل) ، لا يزال بإمكانك متابعة أمثلة Phylo بشكل عام. يقوم Phylip بإنشاء ملف Newick باسم "Outtree" أو "Foo.tree".

(لا تتردد في دمج هذا بإجابة براد ؛ لا يمكنني كتابة تعليق في هذا الموضوع حتى الآن.)

نصائح أخرى

بعض الأشياء تعطي مشاكل هنا:

  1. أنت بحاجة إلى طفل. wait () بعد مكالمة العملية الفرعية بحيث تنتظر الكود الخاص بك حتى يتم تشغيل البرنامج الخارجي.

  2. لا تكتب Muscle فعليًا إلى stdout ، على الرغم من أن وثائق المساعدة تقول إنها تفعل ذلك ، على الأقل مع الإصدار 3.6 الذي لدي هنا. أعتقد أن الأحدث هو v3.8 لذلك قد يتم إصلاح هذا.

يخبرك Biopython أن stdout الذي تمره فارغًا ، وهو الخطأ الذي تراه. حاول تشغيل سطر الأوامر مباشرة:

muscle -in opuntia.fasta

ومعرفة ما إذا كنت ترى إخراج fasta. فيما يلي إصدار يحدد مشكلة الانتظار ويستخدم ملف الإخراج الوسيط:


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)

من وثائق المكتبة الفرعية:

تحذير

استخدم communication () بدلاً من .stdin.write ، .stdout.read أو .stderr.Read لتجنب حالات الجمود بسبب أي من مخازن الأنابيب الأخرى التي تملأها وتمنع عملية الطفل.

لذلك ربما يمكنك تجربة شيء مثل:

mydata = child.communicate()[0]

لديك ضربة خلفية غير محمية في اسم ملف الإخراج الخاص بك ، وهذا ليس جيدًا أبدًا.

استخدم "r" للحصول على سلاسل خام ، أي r'c:\Python26\opuntia.phy'.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top